OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5035|回复: 9

LWIP中RAM_TCP客户端的问题

[复制链接]

5

主题

20

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-11-30
在线时间
10 小时
发表于 2016-12-1 20:23:12 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 zhyocean 于 2016-12-1 21:55 编辑

我使用探索者的开发板更改一个代码,是使用RAM_TCP客户端为模版的,现在遇到一个问题,想请教一下各位大神。这边的客户端需要通过网络循环发送“1;20100001”,“1;20100002”,“1;20100003”这一类的字符串,每次只能发送一个,发送一个完成后服务器那边会把链接断掉,然后下一次发送需要重新握手链接。现在问题是,我在发送的时候,程序会随机的在发送后面某一个一个字符串的时候死掉。即使重新链接也没作用。有的时候第二个就死,有时候第六个死,随机的。下面是代码。
[mw_shl_code=c,true]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);
}
[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

这个例程在连接的时候就是采用回调函数的方式去连接的 发送函数 接收函数都是采用回调函数 速度很慢 我试了慢慢发送 慢慢接收 不会有问题 发送快了就反应不过来了 我觉得吧 你还是用NETCONNECT那个例程比较稳妥 不过里边必须用UCOS
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2016-12-1 20:23:13 | 显示全部楼层
这个例程在连接的时候就是采用回调函数的方式去连接的   发送函数 接收函数都是采用回调函数  速度很慢  我试了慢慢发送  慢慢接收  不会有问题  发送快了就反应不过来了   我觉得吧   你还是用NETCONNECT那个例程比较稳妥  不过里边必须用UCOS
求指导!!!兄弟
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-11-30
在线时间
10 小时
 楼主| 发表于 2016-12-1 21:53:28 | 显示全部楼层
为什么没人呢
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-11-30
在线时间
10 小时
 楼主| 发表于 2016-12-1 21:59:38 | 显示全部楼层
我之前直接用原子的原版例程也是的,如果我按键发送间隔太短,太频繁了的时候,有时候也会卡死,就一直显示Disconnect,非要按键中断再重新按KEY_UP重新链接才可以。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-1 23:19:09 | 显示全部楼层
不要做任何修改,下载开发板的例程按下按键发送数据会不会死机。
开往春天的手扶拖拉机
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-11-30
在线时间
10 小时
 楼主| 发表于 2016-12-1 23:56:11 来自手机 | 显示全部楼层
zuozhongkai 发表于 2016-12-1 23:19
不要做任何修改,下载开发板的例程按下按键发送数据会不会死机。

会,例程我只改了IP,如果发送频繁了也会卡死
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-11-30
在线时间
10 小时
 楼主| 发表于 2016-12-2 20:16:56 | 显示全部楼层
yangkefeng 发表于 2016-12-2 19:14
这个例程在连接的时候就是采用回调函数的方式去连接的   发送函数 接收函数都是采用回调函数  速度很慢  我 ...

NETCONNECT我也试过,也是卡死。不过没事了,现在弄好了,我就在主函数中把循环结构改成了switch就好了,之前用的while(1)+for+if,现在换了这个就好了,我也是醉了,不知道为什么。
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-11-30
在线时间
10 小时
 楼主| 发表于 2016-12-2 20:19:23 | 显示全部楼层
yangkefeng 发表于 2016-12-1 20:23
这个例程在连接的时候就是采用回调函数的方式去连接的   发送函数 接收函数都是采用回调函数  速度很慢  我 ...

主要是用while(1)的时候一旦链接失败之后就直接死了,重连也没用,包括重新初始化也不行,非得复位。不知道是个什么鬼。
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2016-12-5 13:23:54 | 显示全部楼层
zhyocean 发表于 2016-12-2 20:16
NETCONNECT我也试过,也是卡死。不过没事了,现在弄好了,我就在主函数中把循环结构改成了switch就好了, ...

我发现NETCONNECT也有个缺陷,while(1){发送函数},发送速率7MB/S,while(1){发送函数;j接收函数;},只能到100多KB/s,速度就下来了
求指导!!!兄弟
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-8-10
在线时间
3 小时
发表于 2017-7-31 18:29:14 | 显示全部楼层
请问楼主,我参照tcp_client_echo例程写了一个tcp客户端驱动,通过手机按键发送指令给设备,出现按键过程中随机tcp断开连接的情况。能否帮我看看。
http://www.openedv.com/thread-108560-1-1.html
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-18 17:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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