SocketCAN с длительной задержкой получения пакетов - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь реализовать интерфейс CAN на встроенной платформе linux (на основе yocto) с помощью SocketCAN.

После прочтения документации я написал код для быстрого тестирования приложения, чтобы получить / прочитать несколько пакеты из шины 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, и я вижу, что данные изменяются нормально без эта задержка.

У кого-нибудь есть идея, почему в приложении такая задержка? что мне здесь не хватает?

Заранее спасибо.

...