我正在尝试从 socketCAN 中读取,并且始终针对 11 位标识符过滤 msg。这应该是一个可以通过为 29 位标识符设置 roper 标志来解决的问题,但我找不到任何人可以提供帮助的地方......
struct can_frame message;
struct sockaddr_can addr;
struct ifreq ifr;
int fd = -1; // file descriptor (it´s a socket)
if((fd = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
{
LE_INFO("cannot open socket");
return;
}
strcpy(ifr.ifr_name, "can0");
ioctl(fd, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
printf("cannot bind socket\n");
return;
}
uint8_t nbytes;
message.can_id |= CAN_EFF_FLAG;
while(1)
{
nbytes = read(fd, &message, sizeof(struct can_frame));
if (nbytes < 0) {
perror("can raw socket read");
return;
}
/* paranoid check ... */
if (nbytes < sizeof(struct can_frame)) {
fprintf(stderr, "read: incomplete CAN frame\n");
return;
}
printf("READ COB_ID:%x\n",message.can_id | CAN_EFF_FLAG);
}
return;
我正在发送一个带有 idx x901 的 CAN 帧,这就是打印的内容:
读取 COB_ID:80000101
读取 COB_ID:80000101
读取 COB_ID:80000101
我已经以许多不同的方式对此进行了故障排除,并且似乎 C 代码正在正常工作,但我怀疑问题出在内核模块的问题上,即 mcp251x 没有正确接收扩展标志?或者它可能是在运行内核模块之前我需要做一些初始化???
提前感谢任何可以提供帮助的人。