首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SocketCAN: read()函数从不返回

SocketCAN: read()函数从不返回
EN

Stack Overflow用户
提问于 2020-04-22 23:24:37
回答 1查看 393关注 0票数 0

我在一个定制的嵌入式Linux系统上工作,它需要在CAN总线上读写消息。SocketCAN就是用来实现这一点的。

在波特率设置为500kbps的情况下启动CAN接口can0。我正在使用CANoe、cangen和candump来测试消息的接收和传输。当CANoe设置为向嵌入式系统发送消息时,candump在嵌入式系统上读取这些消息是没有问题的。当cangen设置为发送消息时,CANoe可以从嵌入式系统读取消息。

我编写了一个小程序,使用read()函数从can0接口读取消息。当调用read()函数来读取单个CAN消息时,该函数会阻塞,然后再也不会返回。我确信CAN接口正在接收数据,因为ifconfig报告的接收字节数按预期增加。与我的程序同时运行的candump还显示接口正在接收来自总线的CAN消息。下面是打开和读取CAN接口的相关代码。错误检查已被省略。

打开插座:

代码语言:javascript
运行
复制
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));

读取套接字:

代码语言:javascript
运行
复制
struct can_frame frame;
int nbytes = 0;

memset(&frame, 0, sizeof(frame));

/* Never returns despite interface receiving messages */
nbytes = read(socketNum, &frame, sizeof(frame));

我是不是在代码中遗漏了什么或者做错了什么?有没有其他人遇到过这个问题并找到了解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-21 23:27:38

我已经为我的问题找到了一个解决方法。

我正在使用的嵌入式平台使用IMX 8和用于FLEXCAN IP的恩智浦驱动。我的设备树是使用disable-fd-mode选项设置的。即使应该禁用FD模式,我也需要使用setsockopt来“启用”FD模式:

代码语言:javascript
运行
复制
canfd_enabled = 1;
error_code = setsockopt(socketNum, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_enabled, sizeof(int));

在添加了这些代码行之后,我可以像预期的那样从套接字读取和写入。我还读取和写入sizeof(canfd_frame)字节而不是sizeof(can_frame)字节。可能是FLEXCAN驱动程序有问题。根据我的经验,这对于恩智浦驱动程序来说并不少见。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61368853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档