看完阿尔法开发板linux驱动教程的CAN驱动实验后,在can驱动章节的最后有一句“ 如果要编写 CAN 总线应用的话就直接使用 Linux 提供的SocketCAN 接口,使用方法类似网络通信,本教程不讲解应用编程。”
看到这儿就比较好奇了,socketcan到底是什么,怎么使用?带着好奇心从网上开始搜索SocketCAN的相关文章,打算找一个相对简单的教程来做实验,目标如下,写一个SocketCAN的app程序,调用SocketCAN的“驱动程序”,来实现简单演示。找了几篇后终于找到一篇相对符合要求的文章,在此列出原网址的链接。
原文链接:linux can socket 编程-CSDN博客
本教程使用正点原子的阿尔法开发板测试,系统使用ubuntu16.04做实验,默认已经完成了阿尔法开发板的can驱动相关实验,包括使能linux内核自带的FlxeCAN驱动、移植iproute2、移植can-utils和can通讯测试正常。
文章关于socketcan通讯的程序基本分为三部分,分别为xx.h头文件、xx.c “驱动文件”和app测试文件。
首先在ubuntu系统中使用vscode新建一个工程,设置c_cpp_properties.json路径,如下图1所示
图1 c_cpp_properties.json配置
新建socketcan_test.h、socketcantest.c和socketcantestApp.c三个文件。
在socketcan_test.h头文件中,直接复制文章中的头文件内容,不过需要修改几处,如下图2所示
图2 头文件包含部分
修改三部分,1.屏蔽#include <net/if.h>;2. 新增#include <ifaddrs.h>;3.新增#include</usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/net/if.h>
介绍一下修改这几处的原因。第二个因为需要用到其中的结构体定义;屏蔽第一个使用第三个代替,第三个头文件路径为交叉编译器的if.h,包含了ifreq结构体,需要修改这个if.h头文件,新增一行代码,如下图3所示
图3 if头文件修改
新增22行的#define __USE_MISC 1,这样后面的42行__USE_MISC就有被定义,ifreq结构体就在这个__USE_MISC下面使能。
修改完头文件后继续编写socketcantest.c,直接复制文章的socket通讯部分,因为我们自己修改了头文件名称,这里仅修改一下头文件名称即可,把#include "can_driver.h"改为#include "socketcan_test.h"即可。
接下来编写socketcantestApp.c这个文件。和上面类似,直接复制文章的app测试部分内容,修改一下头文件名称即可。
三个文件编写完毕后就可以编译了,编译目标为,将socketcantest.c编译为socketcantest.so动态库文件,将socketcantestApp.c编译为socketcantestApp可执行文件。在当前目录下,编译指令如下:arm-linux-gnueabihf-gcc socketcantest.c -fpic -std=gnu99 -shared -o libsocketcantest.so
arm-linux-gnueabihf-gcc socketcantestApp.c -L . -lsocketcantest -pthread -o socketcantestApp
在编译过程中遇到了几个小插曲,对于我这个入门新手来说还是费了不小的劲儿才搞明白,第一条指令加上-std=gnu99才编译成功;第二条指令,-L表示后面跟的是库文件目录,“.”表示当前目录,“-l”表示后面要跟链接的动态库文件名称,这里明显和libsocketcantest.so对不上,因为这个指令要掐头去尾,把“lib”和“.so”都去了,所以生成.so库文件的时候开头要以”lib”命名,最后还要加上-pthread指令,不然编译报错。编译完成后就会生成libsocketcantest.so和socketcantestApp文件,将libsocketcantest.so拷贝到开发板的根文件系统根目录下的lib目录中,将socketcantestApp拷贝到根文件系统的bin目录中。启动开发板,进入linux系统后,首先设置can的配置参数,输入如下指令:
Ifconfig -a /*查看can0网络是否在线 */
ip link set can0 type can bitrate 250000
ifconfig can0 up
配置好can参数后就可以执行测试app程序了,进入根目录下的bin目录,输入指令:./socketcantestApp
我使用的是usbcan盒与开发板进行通信测试,windows系统使用的是cantest软件,根据之前的设置,配置波特率为250k,通信界面如下图4所示:
图4 通讯测试
点击cantest软件的发送按钮,SecureCRT窗口就会收到接收信息提示,接收窗口中提示的数字内容168、132表示该函数在代码中的行数位置。以上就是socketcan配置的内容。具体socketcan怎么编程使用,需要我们去认真查看socketcantest.c文件内容,我也是简单看了一下,基本了解了socketcan通信的基础知识。这里我将编写的三个文件一起上传,方便大家调试使用。再次声明代码来源。