SocketCAN: функция read () никогда не возвращается - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над собственной встроенной системой 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));

Я что-то упустил в своем коде или что-то не так? Кто-нибудь еще сталкивался с этой проблемой и нашел решение?

...