硬汉嵌入式论坛

 找回密码
 立即注册
搜索
查看: 752|回复: 6
收起左侧

[RL-TCPnet] rl-tcpnet的bsd socket发送出错

[复制链接]

4

主题

11

回帖

23

积分

新手上路

积分
23
发表于 2026-7-14 09:05:13 | 显示全部楼层 |阅读模式
本帖最后由 jiny 于 2026-7-14 09:16 编辑

我用设备接小票打印机,用以下代码可以打印成功!


int32_t PrintSend(char *pData, int32_t Size)
{
  int32_t Ret;
  int32_t Sock;

  if (!pData || !Size) {
    return -1;
  }

  Sock = socket (AF_INET, SOCKTYPE, 0);
  if (Sock < 0) {
    return -1;
  }
  Ret = connect (Sock, (SOCKADDR *)&Addr, sizeof(Addr));
  if (Ret < 0) {
    closesocket (Sock);
    return -1;
  }

  Ret = send(Sock, "0123456789", 10, 0);
  if (Ret < 0) {
    closesocket (Sock);
    return -1;
  }

  closesocket (Sock);
  return Size;
}

但是很诡异,换成如下代码就不行了

int32_t PrintSend(char *pData, int32_t Size)
{
  int32_t Ret;
  int32_t Sock;

  if (!pData || !Size) {
    return -1;
  }

  Sock = socket (AF_INET, SOCKTYPE, 0);
  if (Sock < 0) {
    return -1;
  }
  Ret = connect (Sock, (SOCKADDR *)&Addr, sizeof(Addr));
  if (Ret < 0) {
    closesocket (Sock);
    return -1;
  }

  Ret = send(Sock, "01234", 5, 0);
  if (Ret < 0) {
    closesocket (Sock);
    return -1;
  }
  osDelay(1000);

  Ret = send(Sock, "56789", 5, 0);
  if (Ret < 0) {
    closesocket (Sock);
    return -1;
  }

  closesocket (Sock);
  return Size;
}

网口绿灯一直闪,但是就是打印机无法打印!
愁死人了
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124247
QQ
发表于 2026-7-16 11:35:21 | 显示全部楼层
直接用网络助手发送命令,看看正常不,这个优先测试

正常后再代码测试,直接把TCPnet的ARM官方地址手册给AI,让AI生成代码即可,AI生成socket代码,非常擅长
回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2026-7-16 15:36:02 | 显示全部楼层
本帖最后由 jiny 于 2026-7-16 16:25 编辑

设备接电脑正常,没问题
电脑接小票打印机也正常,没问题
但设备接小票打印机就不对头了
  
  if (tcp_s->Flags & (TCP_IFLAG_DACK | TCP_IFLAG_CLOSING)) {
    /* Last frame not yet acked localy, or the socket is closing */
    return (false);
  }

第二次send时,这里检测通不过(net_tcp.c -> bool net_tcp_check_send (int32_t socket)),
tcp_s->Flags = TCP_IFLAG_DACK,不知道什么原因。

改动代码,强制通过检测后,有明显改善,但还是有可能后续send不成功。
改动如下:

  tcp_s->Flags &= ~TCP_IFLAG_DACK;
  if (tcp_s->Flags & (TCP_IFLAG_DACK | TCP_IFLAG_CLOSING)) {
    /* Last frame not yet acked localy, or the socket is closing */
    return (false);
  }


回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124247
QQ
发表于 2026-7-17 08:09:44 | 显示全部楼层
jiny 发表于 2026-7-16 15:36
设备接电脑正常,没问题
电脑接小票打印机也正常,没问题
但设备接小票打印机就不对头了

这个改进不好,应该在bsd socket层修改。

回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2026-7-18 17:23:02 | 显示全部楼层
本帖最后由 jiny 于 2026-7-18 17:32 编辑


net_tcp.c中void net_tcp_socket_run (void) 函数内如下代码没有运行。
una + tcp_s->MaxSegSize <= win不成立,所以 TCP_IFLAG_DACK没法清空。
水平有限,问题 还没有解决

      else if (tcp_s->Flags & TCP_IFLAG_DACK) {
          uint32_t una = tcp_s->SendNext - tcp_s->SendUna;
          uint32_t win = MIN(tcp_s->CWnd, tcp_s->SendWin);
          if (net_mem_avail_tx () && (una + tcp_s->MaxSegSize <= win)) {
            /* Send netTCP_EventACK notification only if the sliding */
            /* window allows to send additional data, and there is   */
            /* enough free memory for buffering new transmit packets.*/
            DEBUGF (TCP,"Socket %d, callback EventACK\n",tcp_s->Id);
            EvrNetTCP_CallbackEventAck (tcp_s->Id);
            tcp_s->Flags |= TCP_IFLAG_CBACK;
            tcp_s->cb_func (tcp_s->Id, netTCP_EventACK, (NET_ADDR *)&tcp_s->Peer, NULL, 0);
            tcp_s->Flags &= ~(TCP_IFLAG_CBACK | TCP_IFLAG_DACK);
          }
        }
回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2026-7-20 23:10:46 | 显示全部楼层
换成了lwip,暂没发现问题。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124247
QQ
发表于 2026-7-23 10:00:24 | 显示全部楼层
jiny 发表于 2026-7-18 17:23
net_tcp.c中void net_tcp_socket_run (void) 函数内如下代码没有运行。
una + tcp_s->MaxSegSize Flags  ...

修改得方向有误,不需要修改源码,仅修改你的应用代码即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-10-10 17:05 , Processed in 0.484499 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表