2016-11-22 64 views
1

我非常理解CAN协议是如何工作的 - 当两个节点同时尝试使用网络时,较低的id帧可以获得优先级,而另一个节点可以检测到这一点并暂停。套接字如何处理仲裁?

使用socketcan时,这似乎被抽象出来 - 我们只需像任何文件描述符那样进行书写和读取。我可能会误解某些内容,但我已阅读了大部分文档(http://lxr.free-electrons.com/source/Documentation/networking/can.txt),我不认为它是明确描述的。

是否write()阻塞,直到我们的帧是最低的id帧,还是socketcan可以缓冲帧,直到网络准备就绪?如果是这样,用户是否会在发生这种情况时通知我们,或者我们是否使用环回来做这件事?

+0

我知道很长一段时间过去了。你有没有找到答案? – mik1904

回答

1

write不会阻塞通道争用。它可能因为TCP套接字writewould(非常不可能)的原因而阻塞。

CAN外围设备将收到一个要从内核发送的帧,并执行介质访问控制协议(MAC协议)通过线路发送它。 SocketCAN对协议的这一层一无所知。如果帧被缓冲,则取决于外设/驱动程序:链内核驱动程序外设的行为与3个带有自己控制流机制的链式FIFO相同,但通常,它是缓冲区(如果需要的话)的驱动程序大部分是因为外设可用的内存较少。

通过使用SocketCAN接口提供某些标志(参见链接中的4.1.2),可以在CAN协议中订阅错误(通过所谓的“错误帧”发送信号):这是在应用层获取错误信息。

当然你可以通过检查loopback接口来检查一个正确传输的帧,但是它是过量的,上面描述的错误报告机制应该被使用,而且它更容易使用。