SocketCAN远程帧读取失败问题

超级码栗 2014-11-05 03:28:58
Linux下对CAN总线操作,现在写了一个只接收数据的应用程序。
问题是,只能接收到数据帧,远程帧接收不到(read不出来)。
不知是不是can数据过滤设置有问题还是其他哪个不对?
求高手解答~!谢谢~~

(CAN_RAW和CAN_BCM有什么区别?)

代码如下:




int main(int argc, char *argv[])
{
int s;
int ret;
int nbytes;
int loopback = 0;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter filter[1];

//1.套接字
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
strcpy(ifr.ifr_name, "can0");
printf("can0 socket = %d\n", s);

//2.设置
ret = ioctl(s, SIOCGIFINDEX, &ifr);
if(ret < 0){
perror("IOCTL Failed!\n");
return 1;
}
printf("can0 can_ifindex = %x\n", ifr.ifr_ifindex);

//3.协议族
addr.can_family = PF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;

//4.绑定
ret = bind(s, (struct sockaddr *)&addr, sizeof(addr));
if(ret < 0){
perror("Bind Failed!\n");
return 1;
}

//5.设置滤波:接收所有
filter[0].can_id = 0;
filter[0].can_mask = 0;

setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback));
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &filter, sizeof(filter));

printf("Listening...\n");

while(1) {
//6.read数据
nbytes = read(s, &frame, sizeof(struct can_frame));
if(nbytes > 0){
printf("Received a Frame!\n");
printf("Length : %d\n", nbytes);
printf("ID : 0x%X\n", frame.can_id);
}

}

close(s);
return 0;
}

...全文
515 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级码栗 2014-11-06
  • 打赏
  • 举报
回复
引用 2 楼 zhxianbin 的回复:
http://blog.csdn.net/yuanlulu/article/details/7220060
谢谢,这些我都看过,但是还是找不出为什么不能再应用层里读出远程帧的问题。 是不是socketCAN会自动回复远程帧呢?
zhxianbin 2014-11-06
  • 打赏
  • 举报
回复
http://hi.baidu.com/282280072/item/46f39cffabec2ac1a835a232 http://bbs.21ic.com/icview-105670-1-1.html 我的理解是远程帧是总线处理的,如果有相同 ID 的数据,就发送数据
zhxianbin 2014-11-05
  • 打赏
  • 举报
回复
Readme file for the Controller Area Network Protocol Family (aka SocketCAN) This file contains 1 Overview / What is SocketCAN 2 Motivation / Why using the socket API 3 SocketCAN concept 3.1 receive lists 3.2 local loopback of sent frames 3.3 network problem notifications 4 How to use SocketCAN 4.1 RAW protocol sockets with can_filters (SOCK_RAW) 4.1.1 RAW socket option CAN_RAW_FILTER 4.1.2 RAW socket option CAN_RAW_ERR_FILTER 4.1.3 RAW socket option CAN_RAW_LOOPBACK 4.1.4 RAW socket option CAN_RAW_RECV_OWN_MSGS 4.1.5 RAW socket option CAN_RAW_FD_FRAMES 4.1.6 RAW socket returned message flags 4.2 Broadcast Manager protocol sockets (SOCK_DGRAM) 4.2.1 Broadcast Manager operations 4.2.2 Broadcast Manager message flags 4.2.3 Broadcast Manager transmission timers 4.2.4 Broadcast Manager message sequence transmission 4.2.5 Broadcast Manager receive filter timers 4.2.6 Broadcast Manager multiplex message receive filter 4.3 connected transport protocols (SOCK_SEQPACKET) 4.4 unconnected transport protocols (SOCK_DGRAM) 5 SocketCAN core module 5.1 can.ko module params 5.2 procfs content 5.3 writing own CAN protocol modules 6 CAN network drivers 6.1 general settings 6.2 local loopback of sent frames 6.3 CAN controller hardware filters 6.4 The virtual CAN driver (vcan) 6.5 The CAN network device driver interface 6.5.1 Netlink interface to set/get devices properties 6.5.2 Setting the CAN bit-timing 6.5.3 Starting and stopping the CAN network device 6.6 CAN FD (flexible data rate) driver support 6.7 supported CAN hardware 7 SocketCAN resources 8 Credits https://www.kernel.org/doc/Documentation/networking/can.txt

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧