丁洵
2014-11-25 02:58
采纳率: 0%
浏览 3.9k

linux socket can通信,接收端收到的帧包乱序问题,急!

linux socket can通信,接收端收到的帧包乱序问题,急!

CAN网络设计为1个主机(linux平台)8个从机(STM32裸跑),目前在主机上遇到一个偶尔出现的问题:主机在应用层收到从机发来的CAN帧有乱序的情况(只是帧乱序,每个帧内的字节没有乱序)。

举个例子:假设某个从机先发A、再发B这个两个帧,主机在应用层调用read函数却是先读到B帧、再读到A帧。
已经排查过的结论:
1、从机发送出来的帧没有乱序。
2、由于linux下CAN设备被封装为网络设备,驱动层就是标准的网络设备驱动的写法:在接受函数中把收到的can数据填进struct sk_buff *skb,然后调用netif_rx(skb)通知内核已经接收到包。已经确认在调用netif_rx(skb)之前也没有乱序。
3、主机应用程序代码中对CAN设备的访问不存在竞争。

由上面分析,CAN数据是应该是在内核中被调乱了顺序。但是本人对内核和网络协议不熟悉,本来想跟着看看内核代码弄清楚数据是怎么一层层传递到应用层的,结果看了两天内核代码,晕头转向,能力有限又急着定位,希望有朋友能帮忙分析一下,非常感谢。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 91program 2014-11-25 03:28

    Socket UDP 确实存在乱序的可能,这个传输时选择网络路径相关。TCP 不会有这样的问题。

    打赏 评论
  • jiangjingsong8888 2021-03-18 17:56

    请问下,这个问题解决了没有

    打赏 评论

相关推荐 更多相似问题