OpenEdv-开源电子网

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

请教各位大神:stm32F103 netconn tcp客户端无法连续发送数据问题

[复制链接]

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
发表于 2016-10-19 17:35:46 | 显示全部楼层 |阅读模式
10金钱
程序采用的是原子的netconn tcp客户端例程,只是在例程里加了ADC采集的程序,然后将采集的ADC转为字符,并发送至网络调试助手。主体修改部分在tcp_client_demo.c里面。然后就是将按键任务堆栈改为200.
while (1)
        {
                tcp_clientconn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
                err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器
                if(err != ERR_OK)  netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
                else if (err == ERR_OK)    //处理新连接的数据
                {
                        struct netbuf *recvbuf;
                        tcp_clientconn->recv_timeout = 10;
                        netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
                        printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port);
                        while(1)
                        {
                                if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
                                {
                                        int i=0;
                                        for(i=0;i<K;i++)
                {
               
                  value=Get_Adc(ADC_Channel_10);
                  table[0]=value/1000+0x30;//千位
                  table[1]=value/100%10+0x30;//百位
                  table[2]=value/10%100%10+0x30;//十位
                  table[3]=value%1000%100%10+0x30;//个位
                  strcat((char*)table,"\r\n");       
                                       
                                        err = netconn_write(tcp_clientconn ,table,strlen((char*)table),NETCONN_COPY); //发送tcp_server_sentbuf中的数据
                }
                                        if(err != ERR_OK)
                                        {
                                                printf("发送失败\r\n");
                                        }
                                        tcp_client_flag &= ~LWIP_SEND_DATA;
                                }
                                       
                                if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)  //接收到数据
                                {       
                                        OS_ENTER_CRITICAL(); //关中断
                                        memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
                                        for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
                                        {
                                                //判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
                                                //的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
                                                if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
                                                else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
                                                data_len += q->len;         
                                                if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出       
                                        }
                                        OS_EXIT_CRITICAL();  //开中断
                                        data_len=0;  //复制完成后data_len要清零。                                       
                                        printf("%s\r\n",tcp_client_recvbuf);
                                        netbuf_delete(recvbuf);
                                }else if(recv_err == ERR_CLSD)  //关闭连接
                                {
                                        netconn_close(tcp_clientconn);
                                        netconn_delete(tcp_clientconn);
                                        printf("服务器%d.%d.%d.%d断开连接\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
                                        break;
                                }
                        }
                }
        }


其中K值为20。

例程执行过程是按下Key0,发送20个采集的ADC数据至网络调试助手,测试的结果是,有时候可以发送20个,甚至4到5次20个数据至上位机,但有时候就只能发送一个,再按Key0,始终不能发送,需要重启才行。
程序在附件里面,麻烦各位大神们教教我,谢谢。。

网络实验8 NETCONN_TCP客户端.rar

1.16 MB, 下载次数: 179

测试程序

最佳答案

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

发现问题所在了,,,不用strcat函数就可以,用了就不行,,不用发4000个都没有问题,纠结啊。。。。。有哪位高手可以解说下这个问题吗 int i=0; for(i=0;ip=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)table),PBUF_POOL); //申请内存 pbuf_take(es->p,(char*)table,strlen((char*)table)); //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中 tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
 楼主| 发表于 2016-10-19 17:35:47 | 显示全部楼层
发现问题所在了,,,不用strcat函数就可以,用了就不行,,不用发4000个都没有问题,纠结啊。。。。。有哪位高手可以解说下这个问题吗
        int i=0;
                for(i=0;i<K;i++)
                {
               
                        value=Get_Adc(ADC_Channel_10);
                  table[0]=value/1000+0x30;//千位
                  table[1]=value/100%10+0x30;//个位
                  table[2]=value/10%100%10+0x30;//十位
                  table[3]=value%1000%100%10+0x30;//个位
                        table[4]='\r';//个位
                  //strcat((char*)table,"\r");
                        //strcat((char*)table,"\r\n");
                                 
                          es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)table),PBUF_POOL);        //申请内存
        pbuf_take(es->p,(char*)table,strlen((char*)table));        //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中
        tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去       
                }
回复

使用道具 举报

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
 楼主| 发表于 2016-10-19 17:39:20 | 显示全部楼层
我用raw tcp客户端模式也试过,一样的效果,请各位大神们指导下。
回复

使用道具 举报

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
 楼主| 发表于 2016-10-20 10:25:47 | 显示全部楼层
没有人吗
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-10-20 10:59:35 | 显示全部楼层
没用过netconn,你最好把,lwip的调试功能打开,打印一些信息出来,并且代码中也增加一些打印信息,看看出错时是什么情况。
你要搞清楚是不是lwip网络部分没弄好,还是采集存储没弄好,尽量缩小范围。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-20 11:41:08 | 显示全部楼层
qjk9520 发表于 2016-10-20 11:35
发现问题所在了,,,不用strcat函数就可以,用了就不行,,不用发4000个都没有问题,纠结啊。。。。。有哪 ...

你看看strcat之后,你的table数组是怎么变化的,就知道问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
 楼主| 发表于 2016-10-20 11:57:52 | 显示全部楼层
正点原子 发表于 2016-10-20 11:41
你看看strcat之后,你的table数组是怎么变化的,就知道问题了。

原子哥,我测试了,两种方法,table数组是一样的,
回复

使用道具 举报

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
 楼主| 发表于 2016-10-20 12:37:16 | 显示全部楼层
正点原子 发表于 2016-10-20 11:41
你看看strcat之后,你的table数组是怎么变化的,就知道问题了。

C:\Users\Administrator\Desktop\f103RAW_TCP客户端实验


这是我测试效果图
测试效果图.jpg
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 08:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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