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

news/2025/1/15 4:24:44/

让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.ppmy.cn/news/1563221.html

相关文章

<2025 网络安全>《网络安全政策法规-关键信息基础设施安全保护条例》

1 政策出台背景 ‌《关键信息基础设施安全保护条例》的实施背景主要包括以下几个方面‌&#xff1a; 首先&#xff0c;‌关键信息基础设施在经济社会中的重要地位使其成为网络安全的核心保护对象‌。关键信息基础设施包括公共通信和信息服务、能源、交通、水利、金融、公共服…

一些编译脚本

编译zlib export CCaarch64-linux-musl-gcc export CROSS_PREFIXaarch64-none-linux-gnu- export CFLAGS"-Wall -g" ./configure \ --prefix$(pwd)/zlib_arm 编译ffi ./configure \ --prefix$(pwd)/ffi_arm \ --buildx86_64-pc-linux-gnu \ --hostaarch64-none-li…

zig 安装,Hello World 示例

1. 安装 Zig 首先&#xff0c;你需要在你的计算机上安装 Zig 编译器。你可以从 Zig 官方网站 下载适合你操作系统的版本。 安装完成后&#xff0c;你可以在终端中运行以下命令来检查 Zig 是否安装成功&#xff1a; zig version如果一切正常&#xff0c;它会显示 Zig 的版本信…

vue使用自动化导入api插件unplugin-auto-import,避免频繁手动导入

‌unplugin-auto-import‌是一个现代的自动导入插件&#xff0c;旨在简化前端开发中的导入过程&#xff0c;减少手动导入的繁琐工作&#xff0c;提升开发效率。它支持多种构建工具&#xff0c;包括Vite、Webpack、Rollup和esbuild&#xff0c;并且可以与TypeScript配合使用&…

PDF如何提取文字?OCR技术快速识别提取PDF中的文字内容!这种简单方法一定要知道!

在日常工作中&#xff0c;我们常常会遇到PDF文档和图纸中的文字无法直接复制粘贴的问题&#xff0c;尤其是那些文字呈现为打散线条或扫描图片形式的文件&#xff0c;给我们的工作带来诸多不便。不过别担心&#xff0c;PDF快速看图软件的“提取文字”功能&#xff08;基于OCR技术…

校园跑腿小程序---轮播图,导航栏开发

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

性能测试工具Jmeter负载模拟

目录 场景设置 线性属性 补充知识&#xff1a;java线程一般有以下5种状态 场景运行 1.GUI运行测试 2.非GUI运行测试 在Jmeter测试计划中可以实现场景&#xff0c;负载&#xff0c;监听的功能。场景是用来尽量模拟用户的真实操作的工作单元&#xff0c;Jmeter场景主要通过…

2、docker网络和资源控制

docker网络 docker网络的类型 桥接模式&#xff1a;这是docker默认的网络模式&#xff0c;桥接模式工作在第二层&#xff0c;也就是数据链路层。 1、安装完成docker时&#xff0c;docker会自动创建一个虚拟的网络桥&#xff0c;类似于交换机。 2、分配唯一的ip地址&#xf…