私のソフトウェア (C++ で書かれています) では、Linux 標準関数を使用して、CAN バス ソケットを開いて I/O 処理を行っています。
ソケットは次のように開かれ、使用されます。
/* 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 を使用せずにソケットのフラッシュを強制しますか?
私のソフトウェアから修正できる問題ではないかもしれませんが、試してみる価値はあります...