完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我使用探索者的开发板更改一个代码,是使用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个回答
|
|
这个例程在连接的时候就是采用回调函数的方式去连接的 发送函数 接收函数都是采用回调函数 速度很慢 我试了慢慢发送 慢慢接收 不会有问题 发送快了就反应不过来了 我觉得吧 你还是用NETCONNECT那个例程比较稳妥 不过里边必须用UCOS
|
|
|
|
为什么没人呢
|
|
|
|
我之前直接用原子的原版例程也是的,如果我按键发送间隔太短,太频繁了的时候,有时候也会卡死,就一直显示Disconnect,非要按键中断再重新按KEY_UP重新链接才可以。
|
|
|
|
不要做任何修改,下载开发板的例程按下按键发送数据会不会死机。
|
|
|
|
会,例程我只改了IP,如果发送频繁了也会卡死
|
|
|
|
NETCONNECT我也试过,也是卡死。不过没事了,现在弄好了,我就在主函数中把循环结构改成了switch就好了,之前用的while(1)+for+if,现在换了这个就好了,我也是醉了,不知道为什么。
|
|
|
|
主要是用while(1)的时候一旦链接失败之后就直接死了,重连也没用,包括重新初始化也不行,非得复位。不知道是个什么鬼。
|
|
|
|
我发现NETCONNECT也有个缺陷,while(1){发送函数},发送速率7MB/S,while(1){发送函数;j接收函数;},只能到100多KB/s,速度就下来了
|
|
|
|
请问楼主,我参照tcp_client_echo例程写了一个tcp客户端驱动,通过手机按键发送指令给设备,出现按键过程中随机tcp断开连接的情况。能否帮我看看。
http://www.openedv.com/thread-108560-1-1.html |
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2544 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2331 浏览 5 评论
3158 浏览 3 评论
2803 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2761 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
608浏览 1评论
853浏览 0评论
968浏览 0评论
621浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 05:53 , Processed in 1.129000 second(s), Total 94, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号