设想
有一个基于 Linux 的设备连接到 CAN 总线。设备定期发送 CAN 报文。该消息携带的数据的性质类似于测量而不是命令,即只有最近的一个实际上是有效的,如果某些消息丢失了,只要最近的一个成功接收就没有问题。
然后,有问题的设备与 CAN 总线断开连接的时间比后续消息传输之间的间隔长得多。设备逻辑仍在尝试传输消息,但由于总线断开,CAN 控制器无法传输任何消息,因此消息正在累积在 TX 队列中。
一段时间后,CAN 总线连接恢复,所有积累的消息都被一一踢到总线上。
问题
- 当 CAN 总线连接恢复时,将从 TX 队列中传输未定义数量的过时消息。
- 当 CAN 总线连接仍然不可用但 TX 队列已满时,一些最近的消息(即唯一有效的消息)的传输将被丢弃。
- 一旦 CAN 总线连接恢复,在刷新 TX 队列时会出现短期流量突发。如果使用了时间触发总线调度(在我的情况下),这可以改变时间触发总线调度。
问题
我的应用程序使用 SocketCAN 驱动程序,所以基本上这个问题应该适用于 SocketCAN,但如果有的话,也会考虑其他选项。
我看到了两种可能的解决方案:定义消息传输超时(如果在某个预定义的时间内没有传输消息,它将自动丢弃),或者手动中止过时消息的传输(尽管我怀疑使用套接字根本不可能API)。
由于第一个选项对我来说似乎是最真实的,所以问题是:
- Linux下如何定义CAN接口的TX超时?
- 除了 TX 超时之外,是否存在其他选项来解决上述问题?