完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 cwfwh 于 2016-7-31 20:27 编辑 前面已经介绍过编译一个完整的应用程序,链接: https://bbs.elecfans.com/jishu_921002_1_1.html 。 编译一个UDP通讯应用程序,链接:https://bbs.elecfans.com/jishu_921007_1_1.html 。 编译一个串口通讯应用程序,链接:https://bbs.elecfans.com/jishu_922655_1_1.html 。 今天完成EVB-335X-II 开发板最后一个总线: CAN总线的数据收发 。 实现功能: 实现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 。 编译后查看, 如下图 : |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
【盈鹏飞RK3399安卓主板 XPC-3399Pro免费试用】+烧写出厂固件
10320 浏览 0 评论
【盈鹏飞EVB-T335开发板试用体验】debian系统烧写
3348 浏览 1 评论
【盈鹏飞I.MX6UL工控开发板试用体验】linux can 测试
3226 浏览 0 评论
303浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 15:35 , Processed in 0.949667 second(s), Total 68, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号