当前位置: 首页 > news >正文

通信协议_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);}

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

  • 接触过的通信协议Demo合集

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【前端】原生实现图片的放大与缩放
  • 安全防御:双机热备
  • 19.x86游戏实战-创建MFC动态链接库
  • 基于 CNN(二维卷积Conv2D)+LSTM 实现股票多变量时间序列预测(PyTorch版)
  • vue3 tab切换函数回调刷新跳转页面
  • tensorflow keras Model.fit returning: ValueError: Unrecognized data type
  • WordPress外贸建站案例
  • 基于JAVA+SpringBoot+Vue+uniApp的校园日常作品商品分享小程序
  • 航班管理系统【C语言版】单文件编写
  • MPNN消息传递神经网络
  • IDEA的断点调试(Debug)
  • Ajax是什么?如何在HTML5中使用Ajax?
  • 分享一个 .NET EF 6 扩展 Where 的方法
  • ES6 字符串的新增方法(二十)
  • P4-AI产品经理-九五小庞
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2017年终总结、随想
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas 绘制双线技巧
  •  D - 粉碎叛乱F - 其他起义
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 多线程编程之:notify 和 wait 用法
  • Java知识点总结(JavaIO-打印流)
  • Map集合、散列表、红黑树介绍
  • nfs客户端进程变D,延伸linux的lock
  • PAT A1017 优先队列
  • React Native移动开发实战-3-实现页面间的数据传递
  • React 快速上手 - 07 前端路由 react-router
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue中实现单选
  • 翻译--Thinking in React
  • 分布式熔断降级平台aegis
  • 给github项目添加CI badge
  • 前端技术周刊 2019-01-14:客户端存储
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 什么是Javascript函数节流?
  • 使用API自动生成工具优化前端工作流
  • 使用权重正则化较少模型过拟合
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 运行时添加log4j2的appender
  • FaaS 的简单实践
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 国内开源镜像站点
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma pack(1)
  • #pragma预处理命令
  • $(selector).each()和$.each()的区别
  • (2)Java 简介
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (NSDate) 时间 (time )比较
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路