由于系统将CAN设备作为网络设备进行管理,因此在CAN总线应用开发方面,Linux提供了SocketCAN接口,使得CAN总线通信近似于和以太网的通信,应用程序开发接口更加通用,也更加灵活。
此外,通过https://gitorious.org/linux-can/can-utils网站发布的基于SocketCAN的can-utils工具套件,也可以实现简易的CAN总线通信。
下面具体介绍使用SocketCAN实现通信时使用的应用程序开发接口。
1. 初始化
SocketCAN中大部分的数据结构和函数在头文件linux/can.h 中进行了定义。CAN总线套接字的创建采用标准的网络套接字操作来完成。网络套接字在头文件sys/socket.h中定义。套接字的初始化方法如下:
- int s;
- struct sockaddr_can addr;
- struct ifreq ifr;
- s = socket(PF_CAN, SOCK_RAW, CAN_RAW); //创建SocketCAN套接字
- strcpy(ifr.ifr_name, "can0" );
- ioctl(s, SIOCGIFINDEX, &ifr); //指定can0设备
- addr.can_family = AF_CAN;
- addr.can_ifindex = ifr.ifr_ifindex;
- bind(s, (struct sockaddr *)&addr, sizeof(addr)); //将套接字与can0绑定
2. 数据发送
在数据收发的内容方面,CAN总线与标准套接字通信稍有不同,每一次通信都采用can_ frame结构体将数据封装成帧。结构体定义如下:
- struct can_frame {