Я работаю над собственной встроенной системой Linux, которая должна читать и записывать сообщения на шине CAN. SocketCAN используется для выполнения sh этого.
CAN-интерфейс can0 запускается при загрузке со скоростью передачи данных, равной 500 кбит / с. Я использую CANoe, cangen и Candump для проверки приема и передачи сообщений. Когда CANoe настроен на отправку сообщений во встроенную систему, у Candump не возникает проблем при чтении этих сообщений во встроенной системе. Когда cangen настроен на отправку сообщений, у CANoe нет проблем с чтением сообщений из встроенной системы.
Я написал небольшую программу для чтения сообщений из интерфейса can0 с помощью функции read (). Когда вызывается функция read () для чтения одного сообщения CAN, функциональные блоки не возвращаются. Я уверен, что интерфейс CAN получает данные, так как число принятых байтов, сообщаемых ifconfig, увеличивается, как и ожидалось. Запуск Candump одновременно с моей программой также показывает, что интерфейс получает сообщения CAN от шины. Ниже приведен соответствующий код для открытия и чтения интерфейса CAN. Проверка ошибок была пропущена.
Открытие сокета:
int socketNum = 0;
char interface[10] = "can0";
struct sockaddr_can addr;
struct ifreq ifr;
memset(&addr, 0, sizeof(addr));
memset(&ifr, 0, sizeof(ifr));
socketNum = socket(PF_CAN, SOCK_RAW, CAN_RAW);
addr.can_family = PF_CAN;
strncpy(ifr.ifr_name, interface, sizeof(interface));
ioctl(socketNum, SIOCGIFINDEX, &ifr);
addr.can_ifindex = ifr.ifr_ifindex;
bind(socketNum, (struct sockaddr *)&addr, sizeof(addr));
Чтение сокета:
struct can_frame frame;
int nbytes = 0;
memset(&frame, 0, sizeof(frame));
/* Never returns despite interface receiving messages */
nbytes = read(socketNum, &frame, sizeof(frame));
Я что-то упустил в своем коде или что-то не так? Кто-нибудь еще сталкивался с этой проблемой и нашел решение?