我可以强制刷新 CAN 总线插座吗

问题描述 投票:0回答:2

在我的软件(用 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 强制刷新套接字?

也许这不是一个可以通过我的软件解决的问题,但值得一试...

c++ c sockets can-bus
2个回答
0
投票

尝试使用 fflush 或flushall,看看是否有帮助。


0
投票

根据我的经验,不正确的总线终端可能会造成各种间歇性问题!也许尝试一下(如果你还没有尝试过): 检查总线两端是否有 120 欧姆终端,并且终端电阻是否位于(或尽可能靠近)总线末端。 检查总线电阻:总线上应该有 60 欧姆(+- 电阻容差)。

© www.soinside.com 2019 - 2024. All rights reserved.