OpenEdv-开源电子网

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

STM32F4+FreeRTOS+LWIP的tcp_client的接收问题

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-10-17
在线时间
47 小时
发表于 2021-1-22 14:45:31 | 显示全部楼层 |阅读模式
最近调试一个以太网通讯,关于tcp_client接收问题,以下面的函数做为一个接收的进程,通过DHCP获取IP,可以正常通讯,但是有时连通之后,只接收了一条服务器回复,就无法再接收,服务器端收到我的心跳包并且回复了,通过反复复位测试,如果前两条收发正常,后面会一直正常,否则就一直不正常,概率50%,哪位遇到过能提提意见

void tcp_client_receive_thread(void *arg)
{
        err_t err,err_r;
        uint32_t data_len = 0;
        struct pbuf *q;
        struct netbuf *recvbuf;
        static ip_addr_t server_ipaddr,loca_ipaddr;
        static uint16_t  loca_port;

        LWIP_UNUSED_ARG(arg);
        IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
       
    while(1)
    {
        tcp_clientconn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
        err = netconn_connect(tcp_clientconn,&server_ipaddr,global_server_port);  //连接服务器
        if(err != ERR_OK)  
        {
            netconn_delete(tcp_clientconn);  //返回值不等于ERR_OK,删除tcp_clientconn连接
        }
        else if (err == ERR_OK)    //处理新连接的数据
        {
            netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
            while(1)
            {
                err_r = netconn_recv(tcp_clientconn,&recvbuf);
                if(err_r == ERR_OK)  //接收到数据
                {       
                    portENTER_CRITICAL(); //关中断
                    memset(tcp_client_rxbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
                    for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
                    {
                        if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len))
                            memcpy(tcp_client_rxbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
                        else
                            memcpy(tcp_client_rxbuf+data_len,q->payload,q->len);
                        data_len += q->len;
                        if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出       
                    }
                    portEXIT_CRITICAL();  //开中断
                    tcp_client_receive.size = data_len;
                    data_len = 0;
                    netbuf_delete(recvbuf);
                }
                else if(err_r == ERR_CLSD)  //关闭连接
                {
                    tcp_client_flag &= ~LWIP_SEND_DATA;
                    netconn_close(tcp_clientconn);
                    netconn_delete(tcp_clientconn);
                    break;
                }  
            }
        }
        osDelay(5);
    }
}

void tcp_client_receive_init(void)
{   
    sys_thread_new("tcp_client_receive_thread",  tcp_client_receive_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);  //DEFAULT_THREAD_PRIO
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2020-6-23
在线时间
10 小时
发表于 2021-1-23 20:56:19 | 显示全部楼层
楼主,请教一下,你是用cubeMx生成的项目吗?我的生成的TCP都连接不上电脑的服务器,抓包只有60字节,网上说包长度短了要开启自动填充,不知道这么弄
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-10-17
在线时间
47 小时
 楼主| 发表于 2021-1-25 09:09:00 | 显示全部楼层
是用CubeMX生成的,先ping通了,然后调的固定IP和DHCP模式
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2020-6-23
在线时间
10 小时
发表于 2021-1-25 09:38:42 | 显示全部楼层
一頁繁华 发表于 2021-1-25 09:09
是用CubeMX生成的,先ping通了,然后调的固定IP和DHCP模式

能留个联系方式交流一下吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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