首页 > 编程语言 >C#上位机通过CAN总线发送bin文件

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

时间:2025-01-13 20:31:13浏览次数:3  
标签:bin chunkSize frameData C# 总线 currentFrameSize 发送 binData byte

让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, // 自定义消息 ID
        LEN = (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, // 自定义消息 ID
        LEN = (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再继续发送,以避免总线过载或者可能发生的错误。

标签:bin,chunkSize,frameData,C#,总线,currentFrameSize,发送,binData,byte
From: https://blog.csdn.net/weixin_57904199/article/details/145116857

相关文章

  • 数据分析-使用Excel透视图/表分析禅道数据
    背景禅道,是目前国内用得比较多的研发项目管理系统,我们常常会用它进行需求管理,缺陷跟踪,甚至软件全流程的管理,如果能将平台上的数据结公司的实际情况进行合理的分析利用,相信会给我们的项目复盘总结带来比较高的价值。结果预览在写这篇文章时,突然想到可能会有人问:禅道已提......
  • React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次
    基础概念Element对象与Fiber对象Element对象与Fiber对象Element对象定义React的Element对象是一个描述用户界面(UI)的普通JavaScript对象,通常由React.createElement或JSX语法生成。作用它是React应用中的一种描述UI的不可变数据结构。表示一个虚拟DOM......
  • OpenCV机器视觉:主色提取的奇妙之旅
    ###C#OpenCV机器视觉:主色提取的奇妙之旅在当今这个充满数字化与自动化的时代,机器视觉技术正以前所未有的速度改变着我们的生活和生产方式。作为机器视觉领域的佼佼者,OpenCV以其强大的功能和开源的特性,成为了众多开发者心中的“瑞士军刀”。今天,我们将踏上一场奇妙的旅程,探索......
  • 高阶C语言|探索指针的根源之目(进阶指针)
    文章目录前言1.字符指针(`char*`)1.1字符串常量与指针1.2字符指针的使用2.数组指针与指针数组2.1指针数组2.2数组指针3.数组与指针传参3.1一维数组传参3.2二维数组传参4.函数指针(`functionpointer`)4.1函数指针的基本用法4.2使用函数指针数组5.指向函数指......
  • 材料力学仿真软件:Calculix_(3).几何建模与网格划分
    几何建模与网格划分几何建模几何建模的基本概念在材料力学仿真软件中,几何建模是仿真分析的第一步。几何建模是指通过计算机辅助设计(CAD)软件或直接在仿真软件中创建物理模型的几何形状。这些几何形状可以是简单的二维或三维图形,也可以是复杂的结构模型。几何建模的目的是......
  • 材料力学仿真软件:Calculix_(4).边界条件与载荷应用
    边界条件与载荷应用在材料力学仿真软件Calculix中,边界条件和载荷的正确应用是确保仿真结果准确性和可靠性的关键步骤。边界条件定义了模型在特定位置的行为,而载荷则定义了作用于模型上的外力或能量。本节将详细介绍如何在Calculix中设置和应用边界条件与载荷,包括静态载荷、......
  • 材料力学仿真软件:Calculix_(10).热力学耦合分析
    热力学耦合分析1.热力学耦合分析概述热力学耦合分析是指在材料力学仿真过程中,考虑材料的温度变化对力学性能的影响。这种耦合分析在许多工程应用中非常关键,特别是在涉及高温、热处理、热应力等问题时。Calculix作为一个开源的有限元分析软件,提供了强大的功能来处理热力......
  • 材料力学仿真软件:Calculix_(16).高级建模技巧
    高级建模技巧在材料力学仿真的领域中,高级建模技巧是提高仿真精度和效率的关键。本节将详细介绍如何在Calculix中运用这些技巧,包括复杂的几何建模、高级材料属性设置、边界条件的优化以及网格划分的策略。复杂几何建模1.使用CAD工具导入复杂几何模型在进行材料力学仿真......
  • 《STM32开发:深入解析 TIM2->CCR2 与 TIM2.CCR2 的区别与应用》
    前言在最初学习STM32的过程中,由于知识不进脑子,经常边学边忘,并且C语言学习的也比较浅,涉及到指针地址等方面的知识,内心就有点排斥。第一次遇到->和.这两种操作符时,我只是知道按照示例“照着用”,但并不清楚它们之间的具体区别,也没有深入理解它们的内在逻辑。这样的学习方......
  • JavaScript函数:从基础到进阶拓展
    一、引言在前端开发的广袤领域中,JavaScript函数无疑是构建交互性与功能性的基石,其重要性如同搭建积木时的一块块基础组件。想象一下,我们在搭建一座宏伟的积木城堡,每个积木块都代表着一个函数,它们各司其职,有的负责构建城堡的主体结构,有的塑造独特的装饰细节。而函数的拓展,就......