我正在尝试使用 SocketCAN 在嵌入式 linux 平台(基于 yocto)上实现 CAN 接口。
阅读文档后,我编写了一个快速测试应用程序代码,以便在非阻塞模式下从 CAN 总线接收/读取一些包:
int main()
{
int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame rxframe;
int nbytes=0;
char byte0,byte1,byte2,byte3;
//CAN socket setup
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));
fcntl(s, F_SETFL, O_NONBLOCK);
//Read packages test
while(1)
{
nbytes = read(s, &rxframe, sizeof(struct can_frame));
//Package received. Save data.
byte0 = rxframe.data[0];
byte1 = rxframe.data[1];
byte2 = rxframe.data[2];
byte3 = rxframe.data[3];
printf("byte0: %d \n",byte0);
}
return 0;
}
CAN 链路工作并且正在接收数据,但问题是更新数据需要很长时间(几秒钟),例如,如果 byte0 从 0x00 更改为 0xff,则需要约 5 秒才能看到该更改反映在应用程序。
我使用命令检查了控制台:candump can0
我可以看到数据没有延迟就可以正常更改。
有谁知道为什么应用程序会出现这种延迟?我在这里想念什么?
提前致谢。