0

我正在尝试使用 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我可以看到数据没有延迟就可以正常更改。

有谁知道为什么应用程序会出现这种延迟?我在这里想念什么?

提前致谢。

4

0 回答 0