天线|RF射频
直播中

李阳

7年用户 171经验值
私信 关注
[问答]

为什么LWIP中RAM_TCP客户端的字符串会死掉?

我使用探索者的开发板更改一个代码,是使用RAM_TCP客户端为模版的,现在遇到一个问题,想请教一下各位大神。这边的客户端需要通过网络循环发送“1;20100001”,“1;20100002”,“1;20100003”这一类的字符串,每次只能发送一个,发送一个完成后服务器那边会把链接断掉,然后下一次发送需要重新握手链接。现在问题是,我在发送的时候,程序会随机的在发送后面某一个一个字符串的时候死掉。即使重新链接也没作用。有的时候第二个就死,有时候第六个死,随机的。下面是代码。
[C] 纯文本查看 复制代码
void tcp_client_test(){         struct tcp_PCB *tcppcb;          //定义一个TCP服务器控制块        struct ip_addr rmtipaddr;          //远端ip地址        u8 *tbuf;        u8 res=0;                        u8 t=0;         tcp_client_set_remoteip();//先选择IP        tbuf=mymalloc(SRAMIN,200);        //申请内存        if(tbuf==NULL)return ;                //内存申请失败了,直接退出        tcppcb=tcp_new();        //创建一个新的pcb        if(tcppcb)                        //创建成功        {                IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);                 tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);  //连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数         }else res=1;        while(res==0)        {                        get_inquire_string(num);                tcp_client_sendbuf=string_inquire;                  if(tcp_client_flag&1<<5)//是否连接上?                {                        tcp_client_flag|=1<<7;//标记要发送数据                }                if(tcp_client_flag&1<<6)//是否收到数据                {                        OLED_ShowString(90,48,tcp_client_recvbuf,12,1);//显示接收到的数据                                OLED_Refresh_Gram();                        tcp_client_flag&=~(1<<6);//标记数据已经被处理了.                        break;                }                lwip_periodic_handle();                delay_ms(2);                t++;                if(t==200)                {                        if((tcp_client_flag&1<<5)==0)//未连接上,则尝试重连                        {                                 tcp_client_connection_close(tcppcb,0);//关闭连接                                tcppcb=tcp_new();        //创建一个新的pcb                                if(tcppcb)                        //创建成功                                {                                         IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);                                         tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数                                        }                                if((tcp_client_flag&1<<5)==0)                                {                                        tcp_client_connection_close(tcppcb,0);//关闭连接                                        tcppcb=tcp_new();        //创建一个新的pcb                                        if(tcppcb)                        //创建成功                                        {                                                 IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);                                                 tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数                                                }                                        if((tcp_client_flag&1<<5)==0)                                         {                                                num--;                                                break;                                        }                                }                        }                        t=0;                        LED0=!LED0;                }        }        num++;if(num>9)  num=0;        tcp_client_connection_close(tcppcb,0);//关闭TCP Client连接        myfree(SRAMIN,tbuf);}

回帖(9)

吴萍

2019-10-15 07:44:57
这个例程在连接的时候就是采用回调函数的方式去连接的   发送函数 接收函数都是采用回调函数  速度很慢  我试了慢慢发送  慢慢接收  不会有问题  发送快了就反应不过来了   我觉得吧   你还是用NETCONNECT那个例程比较稳妥  不过里边必须用UCOS
举报

张览秀

2019-10-15 07:59:24
为什么没人呢
举报

何玉华

2019-10-15 08:10:28
我之前直接用原子的原版例程也是的,如果我按键发送间隔太短,太频繁了的时候,有时候也会卡死,就一直显示Disconnect,非要按键中断再重新按KEY_UP重新链接才可以。
举报

张丽华

2019-10-15 08:26:29
不要做任何修改,下载开发板的例程按下按键发送数据会不会死机。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分