gpt4 book ai didi

Linux CAN总线传输超时

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:38 25 4
gpt4 key购买 nike

场景

有一个 Linux 驱动的设备连接到 CAN 总线。设备定期传输 CAN 消息。此消息携带的数据的性质更像是测量而不是命令,即只有最近的一个才是真正有效的,如果某些消息丢失,只要成功接收到最新的消息,这不是问题。

然后,相关设备与 CAN 总线断开连接的时间比后续消息传输之间的间隔长得多。设备逻辑仍在尝试传输消息,但由于总线断开连接,CAN Controller 无法传输任何消息,因此消息正在 TX 队列中累积。

一段时间后,CAN 总线连接恢复,所有累积的消息都被一条一条踢到总线上。


问题

  1. 当 CAN 总线连接恢复时,未定义数量的过时消息将从 TX 队列传输。
  2. 当 CAN 总线连接仍然不可用但 TX 队列已满时,一些最新消息(即唯一有效消息)的传输将被丢弃。
  3. 一旦 CAN 总线连接恢复,在刷新 TX 队列时会出现短期流量突发。如果使用了时间触发总线调度,这可能会改变时间触发总线调度(在我的情况下)。

问题

我的应用程序使用的是SocketCAN驱动,所以基本上这个问题应该是针对SocketCAN的,但是如果有的话,其他选项也会考虑。

我看到两种可能的解决方案:定义消息传输超时(如果消息在某个预定义的时间内未传输,它将被自动丢弃),或手动中止过时消息的传输(尽管我怀疑它是否可能在都带有套接字 API)。

由于第一个选项对我来说似乎是最真实的,所以问题是:

  1. 如何在Linux下定义CAN接口(interface)的TX超时时间?
  2. 除了 TX 超时之外,是否还有其他选项可以解决上述问题?

最佳答案

我对这个问题的解决方案是关闭并重新启动设备:

void
clear_device_queue
(void)
{
if (!queue_cleared)
{
const char
*dev = getenv("MOTOR_CAN_DEVICE");
char
cmd[1024];

sprintf(cmd, "sudo ip link set down %s", dev);
system(cmd);

usleep(500000);

sprintf(cmd, "sudo ip link set up %s", dev);
system(cmd);

queue_cleared = true;
}
}

关于Linux CAN总线传输超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19633015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com