在Beaglebone Black上使用C++实现can通讯
2017-08-09 22:35
555 查看
在上一篇中,使用命令方式实现can通讯,但是这种方式只是适合简单测试。这次来介绍如何用C/C++实现can通讯。
在Linux中,can通总线接口设备作为网络设备来管理,Linux提供了SocketCAN接口,用于can通讯。下面来介绍实现的具体步骤。
1 PC安装libsocketcan
1.1 下载libsocketcan源文件http://www.pengutronix.de/software/libsocketcan/download/
1.2 编译libsocketcan,下载之后解压,切换到根目录下
3 源码,参考http://blog.csdn.net/trbbadboy/article/details/17348609
5 在执行生成的目标文件。
PS:如果在执行目标文件的时候,提示找不到.so文件,是因为路径的原因,将libsocketcan路径添加到/etc/ld.so.conf文件末尾,如
在Linux中,can通总线接口设备作为网络设备来管理,Linux提供了SocketCAN接口,用于can通讯。下面来介绍实现的具体步骤。
1 PC安装libsocketcan
1.1 下载libsocketcan源文件http://www.pengutronix.de/software/libsocketcan/download/
1.2 编译libsocketcan,下载之后解压,切换到根目录下
./configure --host=arm-linux-gnueabihf --prefix=/home/zdc/Documents/BBB/code/can/libsocketcan make make install2 在eclipse配置使用libsocketcan库
3 源码,参考http://blog.csdn.net/trbbadboy/article/details/17348609
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <net/if.h> #include <linux/can.h> #include <linux/can/raw.h> #include <sys/socket.h> #include <libsocketcan.h> using namespace std; int main() { int sock_can = 0; int i; struct sockaddr_can addr; static struct can_frame can_frame; struct ifreq ifr; // Set P9.24 P9.26 for can function system("config-pin P9.24 can"); system("config-pin P9.26 can"); // Config can can_set_bitrate("can1",500000); can_do_start("can1"); // Create socket if( (sock_can = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0 ) { cout<<"Create socket failed"<<endl; return -1; } // Set can name for can1 strcpy(ifr.ifr_name, "can1"); ioctl(sock_can, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; // if(bind(sock_can, (struct sockaddr *)&addr, sizeof(addr)) < 0 ) { cout<<"Bind failed"<<endl; close(sock_can); return -2; } can_frame.can_id = 0x123; // can id can_frame.can_dlc = 8; // data length for(i = 0; i < can_frame.can_dlc; i++ ) { can_frame.data[i] = (i+6)*3; } if(write(sock_can, &can_frame, sizeof(struct can_frame)) < 0 ) { cout<<"send failed"<<endl; close(sock_can); return -3; } close(sock_can); // close can1 can_do_stop("can1"); return 0; }4 在BBB板上面安装libsocketcan,具体步骤和PC一样。
5 在执行生成的目标文件。
PS:如果在执行目标文件的时候,提示找不到.so文件,是因为路径的原因,将libsocketcan路径添加到/etc/ld.so.conf文件末尾,如
/home/xxx/xxx然后输入sudo /sbin/ldconfig使其生效。
相关文章推荐
- Beaglebone Black——使用和配置Qt creator的Kit,实现瞬间跨平台
- 使用Beaglebone Black的PRU(三)——实现高达100MHz的GPIO输出
- 【转】 使用Beaglebone Black的PRU(三)——实现高达100MHz的GPIO输出
- 使用SWIG实现C/C++与其他语言间的互相调用
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- COM实现聚合所使用的C++技巧
- SIP协议解析与实现(c和c++ 使用osip) 6
- SIP协议解析与实现(c和c++ 使用osip) 9
- SIP协议解析与实现(c和c++使用osip) 7
- 使用c++的成员指针实现类似Borland VCL组件的事件回调
- 使用c++的成员指针实现类似Borland VCL组件的事件回调
- SIP协议解析与实现(c和c++ 使用osip) 12
- 使用SWIG实现C/C++与其他语言间的互相调用 zz
- SIP协议解析与实现(c和c++使用osip) 1
- 可变参数的使用(C++和C#实现)
- SIP协议解析与实现(c和c++使用osip) 2
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- 使用SWIG实现C++扩展Python