查看: 2462|回复: 0

【EVB-335X-II】CAN网络通信程序(usbCAN模块收据收发)

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-1-16 21:48:02 | 显示全部楼层 |阅读模式
    分享到:
    实现功能:
    实现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.png

    4 通信测试
       4.1 USB转CAN模块的使用。
            cantes软件的使用 :配置如图:
          
    2.png

       4.2 测试
    cantest界面,发送报文 :“00 01 02 03 04 05 06 07”

    3.png

    同时,有接收到报文:“00 01 02 03 04 05 06 07”。
    在终端也打印这段报文,如图:

    4.png

    还显示,can的ID号 。

    cantest界面,发送报文 :

    5.png

    终端打印收到的报文与CAN ID 号 。

    6.png

    总结:
    使用Socket can完成CAN总线通信已经全部完成,并且测试通过。Socket can提供的很多API函数还没有用到,有机会再去研究下。
          到此,已经完成了EVB-335X-II 开发板常用的串口通信程序,网络UDP通信程序,CAN总线通信程序。充分说明了EVB-335X-II 开发板的功能强大之处,完全满足于工业应用。而且在长时间的工作下,数据没有丢包,这是我测试过的。

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 00:28 , Processed in 0.124516 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.