阿尔法开发板的socketCAN通讯测试

看完阿尔法开发板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通信的基础知识。这里我将编写的三个文件一起上传,方便大家调试使用。再次声明代码来源。

原文链接:linux can socket 编程-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值