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

C#上位机通过CAN总线发送bin文件

让gpt生成一段代码用来把bin文件通过can总线发出去

c#代码还是比较强大的,各种功能基本都是一两行代码就实现了,这里记录一下对这个代码的理解和解读

主要代码如下,传入bin文件的地址即可将其从指定的can通道发送出去:

public void SendBINFile(string binFilePath)
{if (!File.Exists(binFilePath)){Console.WriteLine("BIN file not found: " + binFilePath);return;}try{// 读取 BIN 文件byte[] binData = File.ReadAllBytes(binFilePath);int chunkSize = 8; // 每帧发送 8 字节int totalFrames = (binData.Length + chunkSize - 1) / chunkSize;Console.WriteLine($"Sending BIN file: {binFilePath}");Console.WriteLine($"Total data size: {binData.Length} bytes, Frames: {totalFrames}");for (int i = 0; i < totalFrames; i++){// 准备 CAN 消息byte[] frameData = new byte[chunkSize];int currentFrameSize = Math.Min(chunkSize, binData.Length - i * chunkSize);Array.Copy(binData, i * chunkSize, frameData, 0, currentFrameSize);TPCANMsg canMessage = new TPCANMsg{ID = 0x123, // 自定义消息 IDLEN = (byte)currentFrameSize,MSGTYPE = TPCANMessageType.PCAN_MESSAGE_STANDARD,DATA = frameData};// 发送 CAN 消息LastStatus = PCANBasic.Write(Pcan_Handle, ref canMessage);Thread.Sleep(1);if (LastStatus != TPCANStatus.PCAN_ERROR_OK){Console.WriteLine($"Error sending frame {i + 1}: {GetErrorText(LastStatus)}");}else{Console.WriteLine($"Frame {i + 1} sent: {BitConverter.ToString(frameData, 0, currentFrameSize)}");}}}catch (Exception ex){Console.WriteLine("Error sending BIN file: " + ex.Message);}
}

其他都比较简单易懂,其中最核心的就是for循环的这部分:

for (int i = 0; i < totalFrames; i++){// 准备 CAN 消息byte[] frameData = new byte[chunkSize];int currentFrameSize = Math.Min(chunkSize, binData.Length - i * chunkSize);Array.Copy(binData, i * chunkSize, frameData, 0, currentFrameSize);TPCANMsg canMessage = new TPCANMsg{ID = 0x123, // 自定义消息 IDLEN = (byte)currentFrameSize,MSGTYPE = TPCANMessageType.PCAN_MESSAGE_STANDARD,DATA = frameData};// 发送 CAN 消息LastStatus = PCANBasic.Write(Pcan_Handle, ref canMessage);Thread.Sleep(1);

其中framedata用来储存当前要发送的数据,最大8字节,每一个for循环都要进行一次发送。currentFrameSize是当前这轮发送时framedata的尺寸,除了最后一帧外全都是8。

Array.Copy(binData, i * chunkSize, frameData, 0, currentFrameSize)是将“bindata”这个bin文件的指定位置(i * chunkSize)指定大小(currentFrameSize)的数据复制到framedata中用于发送。

其次,Thread.Sleep(1)也是很重要的,250k波特率下每秒can总线发送报文的极限是2000条左右,为了均衡效率和稳定性,我们设置每次发送后延时1ms再继续发送,以避免总线过载或者可能发生的错误。

http://www.lryc.cn/news/522306.html

相关文章:

  • CV 图像处理基础笔记大全(超全版哦~)!!!
  • 2-Kbengine+Unity3D多人在线游戏DEMO源码架构分析
  • Vue.js组件开发-如何实现表头搜索
  • lerna使用指南
  • spark,读取和写入同一张表问题
  • iOS - TLS(线程本地存储)
  • node.js项目依赖关系分析工具 Depazer 的使用
  • QT 如何禁止QComboBox鼠标滚轮
  • 理解CPU负载与使用率
  • 浅谈计算机网络01 | SDN数据平面
  • 《Java开发手册》核心内容
  • 采用海豚调度器+Doris开发数仓保姆级教程(满满是踩坑干货细节,持续更新)
  • 通过将模型权重的矩阵表示为低秩矩阵,可以减少需要调整的参数数量,通俗易懂的解释,不懂你爬网线打我
  • Java并发编程——线程池(基础,使用,拒绝策略,命名,提交方式,状态)
  • DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition 中的空洞自注意力机制
  • 二十三种设计模式-适配器模式
  • 复用类(2):代理、结合使用组合和继承
  • 浅谈云计算07 | 云安全机制
  • 【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理
  • 深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用
  • vue集成高德地图API实现坐标拾取功能
  • Spring Boot Actuator 详细介绍
  • 联通用户管理系统(一)
  • go chan底层分析
  • idea上git log面板的使用
  • WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)
  • dock 制作 python环境
  • 2025第3周 | json-server的基本使用
  • Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件
  • flutter Get GetMiddleware 中间件不起作用问题