我实现了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/