ST意法半导体
直播中

杨雪

8年用户 1207经验值
私信 关注
[问答]

STM32F767+DP83848与电脑进行直连通信,发送数据大于1472字节时,CPU会自动分片发送,为什么?

STM32F767+DP83848 与电脑进行直连通信,采用LWIP+UDP形式,当发送数据大于1472字节时,CPU自动分片发送,用Wireshark抓包工具抓取数据中出现问题?如下图所示
0000   22 b0 22 b1 05 e4 83 c5 a5 00 00 00 00 00 00 00   ".".............
0010   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
......................................................................中间00省略
0580   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0590   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
05a0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
05b0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
05c0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 78 da   ..............x.
05d0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

05e0   00 00 00 dd                                                         ....

此为发送1500个字节数据,帧头帧尾分别为A5和DD,中间的数据全部填0,蓝色部分应该为分片后第二包抓取的数据,但不知道为什么第二包数据中有两个数据字节被78和da覆盖掉了,这两个数据是哪里来的啊???请大神赐教,多谢!

回帖(2)

张博

2025-3-7 14:05:45
楼主请参考下面的建议:
1.        首先问题描述中的“CPU自动分片发送”是指STM32分片发送,还是电脑上的工具发送。如果是电脑工具发送数据,STM32接收,那就是工具的问题。如果是STM32分片发送,那就从STM32这端找问题。
2.        出现数据错误的位置和值是固定的还是随机的?
3.        保存待发送数据的buffer是否存在被其他程序改写的可能,Lwip发送数据的buffer大小是否够?
4.        可以打开opt.h中的Debugging options来帮助调试。
举报

王浩

2025-3-8 17:24:16

在STM32F767与DP83848的以太网通信中,当使用LWIP协议栈并采用UDP协议发送数据时,如果发送的数据大于1472字节,CPU会自动将数据分片发送。这是因为以太网的最大传输单元(MTU)限制了单个数据帧的大小。


1. 为什么数据会被分片?


以太网的MTU通常为1500字节,这是指一个以太网帧中有效载荷(Payload)的最大长度。对于UDP协议,UDP头部占用8字节,IP头部占用20字节,因此UDP数据报的有效载荷最大为:


MTU - IP头部 - UDP头部 = 1500 - 20 - 8 = 1472字节

如果发送的UDP数据报超过1472字节,LWIP协议栈会自动将数据分片,分成多个符合MTU限制的数据帧发送。


2. Wireshark抓包中的问题


从你提供的Wireshark抓包数据来看,数据帧中出现了大量的00填充。这可能是因为:



  • 数据分片:LWIP将数据分片后,某些分片可能没有完全填满MTU,因此会用00填充剩余部分。

  • 数据对齐:以太网帧的最小长度为64字节(包括14字节的以太网头部和4字节的CRC校验)。如果数据帧长度不足64字节,会用00填充。


3. 如何避免数据分片?


如果你不希望数据被分片,可以采取以下措施:



  • 控制数据大小:确保发送的UDP数据报不超过1472字节。

  • 调整MTU:如果你的网络环境支持更大的MTU(例如使用Jumbo Frame),可以调整LWIP的MTU设置。但需要注意,网络中的所有设备都必须支持相同的MTU,否则会导致通信问题。


4. 如何优化Wireshark抓包?



  • 过滤无关数据:在Wireshark中使用过滤器(如udpip.addr == x.x.x.x)来只显示相关的UDP数据包。

  • 检查分片:使用Wireshark的Analyze -> Follow -> UDP Stream功能,查看完整的UDP数据流,确保数据分片和重组是否正确。


5. 其他可能的问题



  • DP83848配置:检查DP83848的配置是否正确,尤其是MTU和缓冲区大小设置。

  • LWIP配置:确保LWIP的MEM_SIZEPBUF_POOL_SIZE等参数足够大,以支持大数据包的发送和接收。


通过以上分析和调整,你应该能够更好地理解数据分片的原因,并优化通信过程。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分