Можно ли принудительно промыть разъем шины CAN?

в моем программном обеспечении (написанном на C ++) я использую стандартные функции Linux, чтобы открывать и выполнять ввод-вывод на шине CAN.

Разъем открывается и используется следующим образом:

   /* Create the socket */
if ((skt = socket( PF_CAN, SOCK_RAW, CAN_RAW )) < 0)
{
...
}

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;

ifr.ifr_ifru.ifru_ivalue = 1000000/2;
ioctl(skt, SIOCSCANBAUDRATE, &ifr);

if(bind( skt, (struct sockaddr*)&addr, sizeof(addr) ) < 0)
{
...
}

Позже код …

write(skt, &msg, sizeof(struct can_frame));

Однако я заметил, что иногда сообщения, которые я только что написал в сокете, не отправляются по шине.
Я думал, что это как буфер, который иногда требует явного сброса (например, много сообщений одновременно и т. Д.).
Я искал по сети, но я не нашел ничего подходящего для моего случая (многие предлагают использовать fflush (), но у меня есть только файловый дескриптор, объявленный как int), поэтому вопрос в том, есть ли способ принудительно сбросить сокет без использования FSTREAM?

Может быть, это не проблема, которую можно исправить с помощью моего программного обеспечения, но стоит попробовать …

1

Решение

Попробуйте использовать fflush или flushall и убедитесь, что это помогает.

0

Другие решения

Других решений пока нет …