当前位置: 首页 > 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再继续发送,以避免总线过载或者可能发生的错误。

相关文章:

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

让gpt生成一段代码用来把bin文件通过can总线发出去 c#代码还是比较强大的&#xff0c;各种功能基本都是一两行代码就实现了&#xff0c;这里记录一下对这个代码的理解和解读 主要代码如下&#xff0c;传入bin文件的地址即可将其从指定的can通道发送出去&#xff1a; public …...

CV 图像处理基础笔记大全(超全版哦~)!!!

一、图像的数字化表示 像素 数字图像由众多像素组成&#xff0c;是图像的基本构成单位。在灰度图像中&#xff0c;一个像素用一个数值表示其亮度&#xff0c;通常 8 位存储&#xff0c;取值范围 0 - 255&#xff0c;0 为纯黑&#xff0c;255 为纯白。例如&#xff0c;一幅简单的…...

2-Kbengine+Unity3D多人在线游戏DEMO源码架构分析

2-Kbengine+Unity3D多人在线游戏DEMO源码架构分析 目录 一、服务器端 1、编写并生成我们的服务器端和客户端通用的游戏协议 2、 认识Entity实体 3、 官方DEMO-kbengine_demos_assets分析 二、 客户端...

Vue.js组件开发-如何实现表头搜索

在Vue.js组件开发中&#xff0c;实现表头搜索通常涉及在表格组件的表头添加输入框&#xff0c;并让用户能够输入搜索关键字来过滤表格数据。 以下是一个使用Element UI的el-table组件实现表头搜索的示例&#xff1a; 一、准备阶段 ‌确保Element UI已安装‌&#xff1a; 确保…...

lerna使用指南

lerna版本 以下所有配置命令都是基于v8.1.9&#xff0c;lerna v5 v7版本差别较大&#xff0c;在使用时&#xff0c;注意自身的lerna版本。 lerna开启缓存及缓存配置 nx缓存是v5版本以后才有的&#xff0c;小于该版本的无法使用该功能。 初始化配置 缓存配置文件nx.json&am…...

spark,读取和写入同一张表问题

读取a表&#xff0c;写入a表 1.写入的是分区表&#xff0c;不报错 2.读取上来之后&#xff0c;创建为临时视图temp&#xff0c;然后先写入a表&#xff0c;再使用temp&#xff0c;就会报错 解决办法&#xff1a;可以先使用temp&#xff0c;再写入a表 3.写入的不是分区表&…...

iOS - TLS(线程本地存储)

从源码中&#xff0c;详细总结 TLS (Thread Local Storage) 的实现&#xff1a; 1. TLS 基本结构 // TLS 的基本结构 struct tls_data {pthread_key_t key; // 线程本地存储的键void (*destructor)(void *); // 清理函数 };// 自动释放池的 TLS class Autorelease…...

node.js项目依赖关系分析工具 Depazer 的使用

node.js项目依赖关系分析工具 Depazer 的使用 Depazer 是一个用于 分析和可视化 Node.js 项目依赖关系 的工具。它可以帮助开发者快速了解项目的依赖结构、模块关系&#xff0c;以及可能存在的问题&#xff0c;从而优化代码架构和依赖管理。 功能特点 依赖关系分析&#xff1…...

QT 如何禁止QComboBox鼠标滚轮

一般情况下&#xff0c;QComboBox会相应鼠标的滚轮事件&#xff0c;即当鼠标停靠在QComboBox上方时&#xff0c;滚动鼠标滚轮&#xff0c;QComboBox的选项会发生切换。但这或许并不是我们希望所出现的&#xff0c;尤其是当QComboBox嵌入在QScrollArea中时&#xff0c;用户只是想…...

理解CPU负载与使用率

目录 CPU使用率 CPU负载 CPU使用率 定义&#xff1a;就像看一个工人干活的时间占他上班时间的比例。比如工人上班8小时&#xff0c;实际干活6小时&#xff0c;干活时间占比就是68100%75%。对于CPU&#xff0c;单核的看它被占用的时间占总时间的比例&#xff0c;多核的就把每个…...

浅谈计算机网络01 | SDN数据平面

浅谈基本云架构 一、计算机网络数据平面的基础理论1.1 数据平面与控制平面的区分1.1.1 两者功能差异1.1.2 协同工作机制 1.2 数据平面在网络架构中的位置与角色1.2.1 与各网络层次的关系1.2.2 对网络整体性能的影响 二、数据平面的关键技术原理2.1 转发技术2.1.1 基于目的地转发…...

《Java开发手册》核心内容

文章目录 引言I 编程规约II 异常日志III 单元测试 :IV 安全规约 :V MySQL数据库:VI 工程结构 :VII 设计规约 :引言 手册的愿景是提升代码质量和开发效率,通过规范化的编码实践来减少错误和提高系统的稳定性。 I 编程规约 命名风格:规定了命名的一致性和规范性,避免使…...

采用海豚调度器+Doris开发数仓保姆级教程(满满是踩坑干货细节,持续更新)

目录 一、采用海豚调度器+Doris开发平替CDH Hdfs + Yarn + Hive + Oozie的理由。 1. 架构复杂性 2. 数据处理性能 3. 数据同步与更新 4. 资源利用率与成本 6. 生态系统与兼容性 7. 符合信创或国产化要求 二、ODS层接入数据 接入kafka实时数据 踩坑的问题细节 三、海…...

通过将模型权重的矩阵表示为低秩矩阵,可以减少需要调整的参数数量,通俗易懂的解释,不懂你爬网线打我

通过将模型权重矩阵表示为低秩矩阵&#xff0c;可以减少需要调整的参数数量&#xff0c;原因在于低秩矩阵的结构本身就比高秩矩阵更“紧凑”&#xff0c;即它们需要的独立参数更少。具体来说&#xff0c;低秩矩阵的结构可以通过减少模型的自由度&#xff08;独立参数的数量&…...

Java并发编程——线程池(基础,使用,拒绝策略,命名,提交方式,状态)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…...

DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition 中的空洞自注意力机制

空洞自注意力机制 文章目录 摘要1. 模型解释1.1. 滑动窗口扩张注意力1.2. 多尺度扩张注意力 2. 代码3. 流程图3.1. MultiDilatelocalAttention3.2. DilateAttention3.3. MLP 摘要 本文针对DilateFormer中的空洞自注意力机制原理和代码进行详细介绍&#xff0c;最后通过流程图梳…...

二十三种设计模式-适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将不兼容的接口转换成客户端期望的接口&#xff0c;从而使原本因接口不匹配而不能一起工作的类可以协同工作。以下是关于适配器模式的详细介绍&#xff1a; 一、定义及作用 定义&am…...

复用类(2):代理、结合使用组合和继承

1 代理 第三种关系称为代理&#xff0c;这是继承与组合之间的中庸之道&#xff0c;因为我们将一个成员对象置于所要构造的类中&#xff08;就像组合&#xff09;&#xff0c;但与此同时我们在新类中暴露了该成员对象的所有方法&#xff08;就像继承&#xff09;。例如&#xff…...

浅谈云计算07 | 云安全机制

云计算安全机制 一、引言二、加密技术&#xff1a;数据的隐形护盾三、散列机制&#xff1a;数据完整性的忠诚卫士四、数字签名&#xff1a;数据来源与真伪的鉴定专家五、公钥基础设施&#xff08;PKI&#xff09;&#xff1a;信任的基石六、身份与访问管理&#xff08;IAM&…...

【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今数字化浪潮汹涌澎湃的时代&#xff0c;零售行业正站在转型升级的十字路口。市场竞争的白热化使得企业必须另辟蹊径&#xff0…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...