OpenEdv-开源电子网

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

使用freertos netconn tcp接收数据长度问题

[复制链接]

4

主题

8

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-11-12
在线时间
6 小时
发表于 2022-5-5 16:23:55 | 显示全部楼层 |阅读模式
10金钱
硬件:stm32f407zet6 lan8720
软件:freertos lwip 采用netconn方式实现tcp服务器,采用cubemx生成。
问题:数据接收的长度偶发性错误,是正确长度的倍数。
    demo是把以太网pbuf的数据长度通过串口打印出来,设置循环100ms发送一次数据,正确结果是6,
结果从串口调试助手中显示的数据长度有冒出来12,18均是6的倍数,如图所示,一直想不明白问题出在哪里?

  1. <blockquote>static void App_Net_Passthrough_Service(void* arg)
复制代码


现象

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

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2022-5-6 17:17:04 | 显示全部楼层
串口打印时间在超过200ms的时候基本都会错误,这个可能是你的程序接收端的问题,接收处理的比较慢,在处理过程中再次收到数据被认为是同一次发送的,所以出现这个情况,可以试试发送慢点
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-11-12
在线时间
6 小时
 楼主| 发表于 2022-5-10 11:11:19 | 显示全部楼层
代码如下:
static void App_Net_Passthrough_Service(void* arg)
{
        struct netbuf *pt_recvbuf;
        uint16_t pt_pbuf_len = 0;
        uint16_t data_len = 0;
        void *pt_data;
       
        LWIP_UNUSED_ARG(arg);
       
    p_t_conn = netconn_new(NETCONN_TCP);            
        p_t_conn->pcb.tcp->so_options |= SOF_KEEPALIVE;
       
        netconn_bind(p_t_conn,
                                 IP_ADDR_ANY,
                                 PASS_THROUGH_PORT);     
        netconn_listen(p_t_conn);            
       
        while(1)
        {
                if( ERR_OK == netconn_accept(p_t_conn, &p_t_conn_newconn) )
                {
                        g_pt_en_flag = 1;  //开启透传服务

                        while( ERR_OK == netconn_recv(p_t_conn_newconn,&pt_recvbuf) )
                        {
                                data_len = 0;
                                do
                                {
                                        netbuf_data(pt_recvbuf, &pt_data, &pt_pbuf_len);
                                        log_i("%d", pt_pbuf_len);
                                        memcpy(pt_buf+data_len, pt_data, pt_pbuf_len);
                                        data_len += pt_pbuf_len;
                                       
                                        if (data_len > P_T_MESSAGE_MAX) break;
                                }while( netbuf_next(pt_recvbuf)>=0 );
                               
                                App_Rs485_Send_Data(pt_buf, data_len);
                                netbuf_delete(pt_recvbuf);
                                data_len = 0;
                        }
                        /* 关闭连接,丢弃连接标识符 */
                        g_pt_en_flag = 0; //关闭透传服务
                        netconn_close(p_t_conn_newconn);
                        netconn_delete(p_t_conn_newconn);
                }
        }
}
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-11-12
在线时间
6 小时
 楼主| 发表于 2022-5-10 11:25:20 | 显示全部楼层
zzk111 发表于 2022-5-6 17:17
串口打印时间在超过200ms的时候基本都会错误,这个可能是你的程序接收端的问题,接收处理的比较慢,在处理 ...

这个接收程序是cubemx自动生成出来的。
Eth_IRQHandler->tcp_ip thread->user tcp server。
我目前tcp_ip thread优先级开到了最高。
在接收过程中再次收到数据,我按照你的建议,这样来试一下。
在临界区中处理pbuf链表。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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