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

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 不会有这样的问题。

    评论

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程