TA的每日心情 | 难过 2021-2-27 22:16 |
---|
签到天数: 1568 天 连续签到: 1 天 [LV.Master]伴坛终老
|
实现功能:
实现Socket CAN的编程,完成CAN总线数据的收发。通过周立功的USB转CAN模块实现数据的收发。
1 Socket CAN介绍
Socket can子系统是在Linux下CAN协议(Controller Area Network)实现的一种实现方法。 CAN是一种在世界范围内广泛用于自动控制、嵌入式设备和汽车领域的网络技术。Linux下最早使用CAN的方法是基于字符设备来实现的,与之不同的是Socket CAN使用伯克利的socket接口和linux网络协议栈,这种方法使得can设备驱动可以通过网络接口来调用。Socket CAN的接口被设计的尽量接近TCP/IP的协议,让那些熟悉网络编程的程序员能够比较容易的学习和使用。
2 程序编写
部分关键代码:
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (s < 0) {
perror("socket PF_CAN failed");
return 1;
}
ret = ioctl(s, SIOCGIFINDEX, &ifr);
if (ret < 0) {
perror("ioctl failed");
return 1;
}
ret = bind(s, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0) {
perror("bind failed");
return 1;
}
FD_ZERO(&rset);
FD_SET(fd, &rset);
ret = select(fd+1, &rset, NULL, NULL, NULL);
if (ret == 0) {
myerr("select time out");
return -1;
}
ret = read(fd, &frdup, sizeof(frdup));
if (ret < sizeof(frdup)) {
myerr("read failed");
return -1;
}
if (frdup.can_id & CAN_ERR_FLAG) {
handle_err_frame(&frdup);
myerr("CAN device error");
continue;
}
print_frame(&frdup);
ret = write(fd, &frdup, sizeof(frdup));
3 程序编译
这里程序的编译,还是使用上节介绍的 Makefile 来编译 。
使用的交叉编译器是:
arm-linux-gnueabihf-gcc 。
编译后查看, 如下图 :
4 通信测试
4.1 USB转CAN模块的使用。
cantes软件的使用 :配置如图:
4.2 测试
cantest界面,发送报文 :“00 01 02 03 04 05 06 07”
同时,有接收到报文:“00 01 02 03 04 05 06 07”。
在终端也打印这段报文,如图:
还显示,can的ID号 。
cantest界面,发送报文 :
终端打印收到的报文与CAN ID 号 。
总结:
使用Socket can完成CAN总线通信已经全部完成,并且测试通过。Socket can提供的很多API函数还没有用到,有机会再去研究下。
到此,已经完成了EVB-335X-II 开发板常用的串口通信程序,网络UDP通信程序,CAN总线通信程序。充分说明了EVB-335X-II 开发板的功能强大之处,完全满足于工业应用。而且在长时间的工作下,数据没有丢包,这是我测试过的。
|
|