我正在开发一个需要在 CAN 总线上读写消息的定制嵌入式 Linux 系统。SocketCAN 被用来完成这个。
CAN 接口 can0 在引导时启动,波特率设置为 500 kbps。我正在使用 CANoe、cangen 和 candump 来测试消息的接收和传输。当 CANoe 设置为向嵌入式系统发送消息时,candump 在嵌入式系统上读取这些消息是没有问题的。当 cangen 设置为发送消息时,CANoe 从嵌入式系统读取消息没有问题。
我编写了一个小程序,使用 read() 函数从 can0 接口读取消息。当调用 read() 函数来读取单个 CAN 消息时,函数会阻塞,然后永远不会返回。我确信 CAN 接口正在接收数据,因为 ifconfig 报告的接收字节数按预期增加。与我的程序同时运行 candump 还显示接口正在从总线接收 CAN 消息。下面是打开和读取CAN接口的相关代码。已省略错误检查。
打开插座:
int socketNum = 0;
char interface[10] = "can0";
struct sockaddr_can addr;
struct ifreq ifr;
memset(&addr, 0, sizeof(addr));
memset(&ifr, 0, sizeof(ifr));
socketNum = socket(PF_CAN, SOCK_RAW, CAN_RAW);
addr.can_family = AF_CAN;
strncpy(ifr.ifr_name, interface, sizeof(interface));
ioctl(socketNum, SIOCGIFINDEX, &ifr);
addr.can_ifindex = ifr.ifr_ifindex;
bind(socketNum, (struct sockaddr *)&addr, sizeof(addr));
读取套接字:
struct can_frame frame;
int nbytes = 0;
memset(&frame, 0, sizeof(frame));
/* Never returns despite interface receiving messages */
nbytes = read(socketNum, &frame, sizeof(frame));
我是否在代码中遗漏了某些内容或做错了什么?有没有其他人遇到过这个问题并找到了解决方案?