在我的软件(用 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 的情况下强制刷新套接字?
也许不是可以通过我的软件解决的问题,但值得一试...