Mg_Ting 2014-11-25 02:58 采纳率: 0%
浏览 3989

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

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog