通信协议_C#实现CAN通信

CAN协议

  • CAN(Controller Area Network)即控制器局域网络。
  • 特点
  1. 多主网络:网络上的任何节点都可以主动发送数据,不需要一个固定的主节点。
  2. 双绞线:使用双绞线作为通信介质,支持较远的通信距离。
  3. 差分信号:使用差分信号传输,增强了抗干扰能力。
  4. 非破坏性仲裁:多个节点同时发送数据时,具有更高优先级(较低ID)的帧会获得总线控制权。
  5. 错误检测:具有错误检测和容错机制,能够检测出传输错误并自动重传。
  6. 数据帧:标准数据帧长度为8字节,扩展数据帧可以更长。
  7. 传输速率:通常在125 kbps至1 Mbps之间,高速CAN可达5 Mbps。
  • 工作原理
  1. 帧格式:CAN协议定义了多种帧类型,包括数据帧、远程帧、错误帧和过载帧。
  2. 仲裁:通过帧ID进行仲裁,ID越低优先级越高。
  3. 位速率:所有节点必须以相同的位速率通信。
  • CAN协议中主要帧类型的格式:
1. 数据帧

数据帧用于传输实际的数据。

2. 远程帧

远程帧用于请求发送具有特定ID的数据帧。

数据帧和远程帧格式:
帧起始 | 仲裁场 | 控制场 | 数据场 | CRC场 | ACK场 | 帧结束
  1位    1-2字节   1字节    0-8字节   3字节   2位    7位
3. 错误帧

当某个节点检测到错误时,它会发送错误帧来中断当前传输。

错误帧格式:
错误标志 | 错误界定符
  6位         8位
4. 过载帧

过载帧用于在需要更多时间来处理接收到的帧时暂时停止总线活动:

过载帧格式:
过载标志 | 过载界定符
  6位         8位

基于Kvaser实现CAN通信

配置环境:1.官网下载KvaserCANKing,KvaserCANDriver,KvaserCANDll ->
2.进行安装 -> 3.开启驱动 -> 4.开启CANKing -> 5.新建项目。

在这里插入图片描述
配置VS项目:1.在下载的DLL文件中找到Kvaser.Canlib库 -> 2.将此库导入vs项目 ->
3.将项目构建为X86 -> 4.将canlib32.dll放入项目文件的debug文件夹中 -> 5.重构项目

在这里插入图片描述
发送消息Demo:

    {
        //初始化Can对象
        Canlib.canInitializeLibrary();

        //打开通道,获取句柄
        int handle = Canlib.canOpenChannel(0, Canlib.canOPEN_ACCEPT_VIRTUAL);

        //通过句柄设置波特率
        Canlib.canSetBitrate(handle, Canlib.canBITRATE_500K);

        //打开连接
        Canlib.canBusOn(handle);

        //发送
        byte[] dates = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };

        //句柄,消息标识符,数据,数据位,帧类型
        Canlib.canWrite(handle, 456, dates, 8, Canlib.canMSG_STD);

        //关闭连接
        Canlib.canBusOff(handle);
    }

接收消息Demo:

  {
      //初始化Can对象

      Canlib.canInitializeLibrary();

      //打开通道,获取句柄

      int handle = Canlib.canOpenChannel(1, Canlib.canOPEN_ACCEPT_VIRTUAL);

      //通过句柄设置波特率
      Canlib.canSetBitrate(handle, Canlib.canBITRATE_500K);


      //打开连接
      Canlib.canBusOn(handle);

      //接受
      byte[] dates = new byte[8];

      
       Canlib.canRead(handle, out int id, dates, out int dlc, out int flag, out long time).ToString();

      textBox1.Text= BitConverter.ToString(dates)+id.ToString();
      Canlib.canClose(handle);

  }

实现功能:
在这里插入图片描述

相关推荐

  1. socket通信实现TCP协议的同步通信

    2024-07-20 10:22:01       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 10:22:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 10:22:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 10:22:01       45 阅读
  4. Python语言-面向对象

    2024-07-20 10:22:01       55 阅读

热门阅读

  1. AI Native应用中的模型微调

    2024-07-20 10:22:01       19 阅读
  2. 题解/算法 {3219. 切蛋糕的最小总开销 II}

    2024-07-20 10:22:01       10 阅读
  3. web前端 Vue 框架面试120题(一)

    2024-07-20 10:22:01       14 阅读
  4. ceph进程网卡绑定逻辑

    2024-07-20 10:22:01       14 阅读
  5. 网络安全-网络安全及其防护措施12

    2024-07-20 10:22:01       13 阅读
  6. C# 结构体(Struct)

    2024-07-20 10:22:01       16 阅读
  7. Ubuntu Docker 安装

    2024-07-20 10:22:01       15 阅读
  8. protoc-gen-go-http: program not found or is not executable

    2024-07-20 10:22:01       16 阅读
  9. Isaac Lab

    2024-07-20 10:22:01       17 阅读
  10. C#虚方法和抽象方法

    2024-07-20 10:22:01       16 阅读
  11. XSLT 客户端:功能与应用解析

    2024-07-20 10:22:01       15 阅读
  12. 概率论原理精解【1】

    2024-07-20 10:22:01       19 阅读
  13. 百度自动驾驶apollo源码解读12:线程池

    2024-07-20 10:22:01       19 阅读