Как получить данные с нескольких узлов CAN как можно быстрее - PullRequest
0 голосов
/ 14 октября 2019

Для применения в робототехнике я хочу считывать данные с нескольких контроллеров двигателя по шине CAN. Контроллеры (узлы) отвечают на запросы удаленной передачи. Поэтому я сначала отправляю сообщение с установленным битом RTR и жду ответа. Поскольку это часть системы управления с замкнутым контуром, я хочу, чтобы код выполнялся настолько быстро (и максимально надежно), насколько это возможно.

Я использую SocketCan на Raspberry Pi 4. Узлы являются контроллерами двигателя ODrive (https://discourse.odriverobotics.com/t/can-interface-available-for-testing/1448). Пока я делаю это, многократно записывая и читая для каждого узла:

// initialize socket
int skt = socket( PF_CAN, SOCK_RAW, CAN_RAW );
struct ifreq ifr;
strcpy(ifr.ifr_name, "can0");
ioctl(skt, SIOCGIFINDEX, &ifr);

struct sockaddr_can addr;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind( skt, (struct sockaddr*)&addr, sizeof(addr) );
...

struct can_frame rtr_frame_1;
rtr_frame_1.can_id = id_1 | CAN_RTR_FLAG;
...

struct can_frame rtr_frame_2;
rtr_frame_2.can_id = id_2 | CAN_RTR_FLAG;
...


struct can_frame receive_frame_1;
struct can_frame receive_frame_2;

// receive data from first node
write(skt, &rtr_frame1, sizeof(can_frame));
read(skt, &receive_frame_1, sizeof(can_frame));

// receive data from second node
write(skt, &rtr_frame2, sizeof(can_frame));
read(skt, &receive_frame_2, sizeof(can_frame));
...

Это работает, но я чувствую, что это не лучшее решение.

Можно ли сначала отправить все RT-запросы, а затем прочитать их из какого-либо стека? Как я могу справиться с потерей кадров, не читая read () до бесконечности?

...