2

我非常了解 CAN 协议的工作原理——当两个节点尝试同时使用网络时,较低的 id 可以帧获得优先权,而另一个节点检测到这一点并停止。

使用 socketcan 时,这似乎被抽象掉了——我们像任何文件描述符一样简单地写入和读取。我可能误解了一些东西,但我已经浏览了大部分文档(http://lxr.free-electrons.com/source/Documentation/networking/can.txt),我认为它的描述并没有明确。

write() 会阻塞直到我们的帧是最低 id 帧,还是 socket 可以缓冲帧直到网络准备好?如果是这样,当这种情况发生时是否通知用户或者我们是否为此使用环回?

4

1 回答 1

1

write不会阻止频道争用。由于与 TCP 套接字相同的原因(非常不可能)write ,它可能会阻塞。

CAN 外围设备将接收从内核发送的帧并执行媒体访问控制协议(MAC 协议)以通过线路发送它。SocketCAN 对协议的这一层一无所知。

缓冲帧的位置取决于外设/驱动程序:链内核驱动外设表现为 3 个链式 FIFO,具有自己的控制流机制,但通常,自外设以来,缓冲(如果需要)最多的是驱动程序可用内存较少。

可以通过使用 SocketCAN 接口(请参阅链接中的 4.1.2)提供某些标志来订阅 CAN 堆栈协议中的错误(由所谓的“错误帧”发出信号):这是在以下位置获取错误信息的方法应用层。

当然你可以通过检查loopback接口来检查是否正确传输的帧,但是有点大材小用,应该使用上面介绍的错误报告机制,这样更容易使用。

于 2017-10-05T14:37:43.133 回答