Я пытаюсь реализовать интерфейс 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
, и я вижу, что данные изменяются нормально без эта задержка.
У кого-нибудь есть идея, почему в приложении такая задержка? что мне здесь не хватает?
Заранее спасибо.