linux - 延迟接收Socket Can消息

标签 linux sockets raspberry-pi delay socketcan

我实现了Linux应用程序,该应用程序接收CAN消息并计算周期(在树莓派pi4上使用socketcan)。问题是有时(大约0.5%)socket可以延迟接收消息。当我从笔记本电脑(使用矢量工具)发送波特率为500Kbps的10ms消息时,通常我可以从树莓派获得合理的周期(9ms〜11ms)。但是有时它会带有15ms〜16ms(然后,下一条消息会在4ms〜5ms之后发出)。即使仅发送1条消息,也会发生相同的现象,因此总线负载可能不是原因。我该如何解决这个问题?
这是我的源代码,如下所示。

wiringPiSetupSys();

if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
{
    perror("Socket");
    return 1;
}

strcpy(ifr.ifr_name, "can0");
ioctl(s, SIOCGIFINDEX, &ifr);

memset(&addr, 0, sizeof(addr));
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;

if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
    perror("Bind");
    return 1;
}

while (1)
{
    nbytes = read(s, &frame, sizeof(struct can_frame));
    period = micros() - last_timer;
    last_timer = micros();
}

最佳答案

我认为对于正确的帧接收时间,您需要获取帧时间戳,而不是系统值。
从套接字读取消息后,您可以通过ioctl调用获得确切的时间戳。

struct timeval tv;
ioctl (s, SIOCGSTAMP, & tv);

关于linux - 延迟接收Socket Can消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65047011/

相关文章:

sockets - 安卓应用 : Address Family not Supported by Protocol

java - 如何在 Java 中为套接字连接创建软件负载平衡器

ruby-on-rails - 启动时在 Raspberry PI 上启动瘦服务器

c# - HTTPS POST/GET 不适用于 Mono

linux - 检查 D.userid 是否存在于目录 shell 中

c - 使用基于 futex 的锁来管理跟踪服务员的最有效方法是什么?

php安装imagick时出错

python - Cron 作业正在将错误写入错误日志,但无法将输出写入输出日志文件

Java 如何使用 ObjectInputStream 进行读取

boot - Raspbian 的软 float 版本无法启动