gpt4 book ai didi

linux - 延迟接收Socket Can消息

转载 作者:行者123 更新时间:2023-12-03 11:54:44 30 4
gpt4 key购买 nike

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

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