我可以强制冲洗 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 总线插座吗的主要内容,如果未能解决你的问题,请参考以下文章

“插座”,SocketCAN怎么用?

无需打开插座即可连接蓝牙设备

无法链接到 XCode9 中的插座集合

Angular2 - 具有登录结构的路由器插座

卡依(XLR插座和ADAT光接口的特点

使用ESP8266NodeMCU机智云改造传统插座为智能插座