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

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


http://www.kler.cn/a/501947.html

相关文章:

  • 【算法】将单链表按值划分
  • 【Docker】Docker部署多种容器
  • linux的大内核锁与顺序锁
  • ubuntu20下编译linux1.0 (part1)
  • 硬件设计-七位半电压表硬件方案(下)
  • ASP.NET Core 中使用 Cookie 身份验证
  • 高阶C语言|探索指针的根源之目(进阶指针)
  • 云原生周刊:Prometheus 3.0 正式发布
  • 检测模型安全的更高级的方法
  • 例子:WeTextProcessing,如何查看现在已安装的这个模块的版本号呢?查看虚拟环境中模块的版本
  • 征服Windows版nginx(2)
  • 今日总结 2025-01-13
  • 【Apache Paimon】-- 14 -- Spark 集成 Paimon 之 Filesystem Catalog 与 Hive Catalog 实践
  • matlab的绘图的标题中(title)添加标量以及格式化输出
  • 青少年编程与数学 02-006 前端开发框架VUE 17课题、组件深入
  • CClink IEF Basic设备数据 转 EtherCAT项目案例
  • 基于React的两种方式使用React-pdf
  • 开关不一定是开关灯用 - 命令模式(Command Pattern)
  • HarMonyOS使用Tab构建页签
  • Megatron:深度学习中的高性能模型架构
  • LeetCode 977 题:有序数组的平方
  • Python AI教程之十八:监督学习之决策树(9) 决策树模型中的过度拟合
  • 提升租赁效率的租赁小程序全解析
  • ElasticSearch在Windows环境搭建测试
  • springcloudalibaba集成fegin报错ClassNotFoundException解决方案
  • 探索 C++ 与 LibUSB:开启 USB 设备交互的奇幻之旅