STM32F407-LwIP_TCP_Echo_Server移植累积多个数据包

2019-07-14 13:08发布

我是参考LwIP_TCP_Echo_Server这个例子,用的STM32F407移植的,网络连接正常,通信都通了,但是最近严格测试的时候发现个奇怪的问题。
测试环境:1。电脑端打开网络助手,用tcp_client模式连接板子(tcp_server),并成功建立连接
2。用网络助手向板子(tcp_server)发送数据


出现问题现象如下:当我手动发送数据或自动发送间隔大于250ms时,板子(tcp_server)端接收数据正常,但当我自动发送间隔小于100ms时,板子(tcp_server)端接收一包数据,我解析出来会是我发送的两包或三包。问题例子如下,当我电脑端发送“01 03 00 20 00 08 45 C6”这包数据时,出现问题时板子会接收到“01 03 00 20 00 08 45 C6 01 03 00 20 00 08 45 C6 01 03 00 20 00 08 45 C6”这样一组数据,正好是我发送数据的整包数,这样我的应用程序就没法解析啦,整了两天了也没弄出来,望高手指点下。


我对问题的分析:因为例子中,对以太网包用的是轮询模式,所以我怀疑是轮询模式慢,当我发送数据包间隔小于100ms时,以太网DMA的收数据快于我处理接收数据的速度,所以会累积多个数据包,导致上述现象的发生,但没找到解决办法。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
ji5687
1楼-- · 2019-07-14 22:08
如果不改变轮询的方式,可以在包的数据里头增加格式定义,例如帧头帧尾、每帧的字节数、异或校验等等,这就相当于你们自定义一个简单的协议。

如果没法定义数据格式,那可以试试中断的方式,那就是 MCU 端的事情,还是得写不少的代码,以及对这款 MCU 网络部分各个寄存器的理解,或许还可以加上 PHY 层 IC 的寄存器。

我记得 PHY 层 IC 也是可以设置中断输出的,但不知道能不能在收到一个包之后就输出一个 IO 信号。如果可以的话,那 MCU 就需要有一个 IO 口与之配合。

总之,为了整个系统稳定运行,工作量都不会小。
秦翙栀610
2楼-- · 2019-07-15 03:35
ji5687 发表于 2019-4-30 19:27
如果不改变轮询的方式,可以在包的数据里头增加格式定义,例如帧头帧尾、每帧的字节数、异或校验等等,这就相当于你们自定义一个简单的协议。

如果没法定义数据格式,那可以试试中断的方式,那就是 MCU 端的事情,还是得写不少的代码,以及对这款 MCU 网络部分各个寄存器的理解,或许还可以加上 PHY 层 IC 的寄存器。

首先感谢您的热心答复。对于您说的在数据里增加协议字段,这个不太适合我这个项目。要是采用中断方式,DMA收到一包数据触发中断,但STM32F4的demo程序里都是轮询的,没有中断的例子,在网上查了下也没找到。不知您那有这方面资料,最好是例程。PHY层IC这个倒没怎么注意过,回头看看手册。
秦翙栀610
3楼-- · 2019-07-15 08:15
    问题解决了,发现不是我程序的问题,是网络助手的问题,网络助手要是发送数据间隔小于100ms,会把两包或更多数据一起打包发送出去,用wireshark抓包抓到的,希望大家以后也注意这个问题啊
www030
4楼-- · 2019-07-15 12:58
 精彩回答 2  元偷偷看……
gungmng
5楼-- · 2019-07-15 18:27
好问题,谢谢楼主的分享。
我在使用过程中,发现407的tcp,总是出现中断的现象,不知为何?
不知道楼主使用网络的过程中,有没有ping包掉包的情形?
谢谢。
cmh6
6楼-- · 2019-07-15 23:10
楼主您好!我在st官网找了好久它的例程,一直没有找到,请问在官网的哪里啊?

一周热门 更多>