в моем программном обеспечении (написанном на 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?
Может быть, это не проблема, которую можно исправить с помощью моего программного обеспечения, но стоит попробовать …
Попробуйте использовать fflush или flushall и убедитесь, что это помогает.
Других решений пока нет …