我可以强制冲洗 CAN 总线插座吗
Posted
技术标签:
【中文标题】我可以强制冲洗 CAN 总线插座吗【英文标题】:Can I force flushing a CAN bus socket 【发布时间】:2014-02-18 09:52:30 【问题描述】:在我的软件(用 C++ 编写)中,我使用 Linux 标准函数在 CAN 总线套接字上打开并执行 I/O 操作。
socket被打开并使用如下:
/* 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 的情况下强制刷新套接字?
也许不是可以通过我的软件解决的问题,但值得一试...
【问题讨论】:
尝试使用将标志设置为 MSG_NOWAIT 的 sendto。写入与不带标志的发送相同。 使用mailing list 寻求帮助。 您是否在检查 write() 是否成功?可能是缓冲区已满,您会收到errno == ENOBUFS
。
@cup 使用 send() 并且该标志不起作用,问题仍然存在。
@cup 同样的事情......现在我要更好地检查 errno 状态。我尝试在写入 16 can_frame 后添加 100 毫秒的简单睡眠,问题似乎解决了
【参考方案1】:
尝试使用 fflush 或 flushall 并看到它有帮助。
【讨论】:
如果 fflush() 需要 FStream 并且我有一个 int,我该如何使用它?我不认为我可以在套接字上打开流而不造成严重问题...... 也许这会有所帮助-forums.codeguru.com/…以上是关于我可以强制冲洗 CAN 总线插座吗的主要内容,如果未能解决你的问题,请参考以下文章