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

C#实现HC32L130 CRC16校验

要在 C# 中实现与小华 HC32L130 MCU 匹配的 CRC16 校验,需先明确HC32L130 的 CRC16 参数规则,再基于该规则编写 C# 代码。

一、HC32L130 的 CRC16 参数解析

从你提供的文档和 MCU 代码可提取核心参数:

参数项具体值 / 规则
多项式\(x^{16}+x^{12}+x^5+1\) → 十六进制0x1021
初始值0xFFFF(对应代码中M0P_CRC->RESULT = 0xFFFF
输入数据处理8 位字节,无反射(按字节的bit7→bit0顺序处理)
输出结果处理无反射、无最终异或(代码直接返回RESULT寄存器值)
对应标准 CRC 类型CRC-16/CCITT-FALSE(与该标准参数完全一致)

二、C# 实现 HC32L130 的 CRC16 算法

基于上述参数,C# 代码需模拟 HC32L130 硬件的 CRC 运算逻辑(逐字节处理、左移 + 多项式异或):

csharp

运行

using System; public static class Hc32L130Crc16 { /// <summary> /// 计算与HC32L130匹配的CRC16(8位字节输入) /// </summary> /// <param name="data">待计算的字节数组</param> /// <returns>CRC16校验值(16位无符号整数)</returns> public static ushort Calculate(byte[] data) { // 1. 初始化CRC寄存器(与MCU一致:0xFFFF) ushort crc = 0xFFFF; // 2. CRC多项式(与文档一致:0x1021) const ushort polynomial = 0x1021; // 3. 逐字节处理输入数据 foreach (byte b in data) { // 将当前字节扩展为16位(左移8位),与CRC寄存器异或(模拟MCU写入8位DATA的硬件逻辑) crc ^= (ushort)(b << 8); // 4. 对当前字节处理8位(逐位左移+多项式异或) for (int i = 0; i < 8; i++) { // 若CRC最高位(bit15)为1,左移后异或多项式;否则仅左移 crc = (crc & 0x8000) != 0 ? (ushort)((crc << 1) ^ polynomial) : (ushort)(crc << 1); } } // 5. 直接返回结果(无最终异或,与MCU代码一致) return crc; } }

三、代码验证(确保与 MCU 结果一致)

可通过标准测试数据验证 C# 代码与 HC32L130 的一致性:

  • 测试数据:ASCII 字符串"123456789"(字节数组:0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39
  • CRC16/CCITT-FALSE 标准结果:0x29B1

C# 测试代码:

csharp

运行

byte[] testData = System.Text.Encoding.ASCII.GetBytes("123456789"); ushort crcResult = Hc32L130Crc16.Calculate(testData); Console.WriteLine($"CRC16结果:0x{crcResult:X4}"); // 输出应为 0x29B1

若 MCU 中调用CRC16_Get8计算该数据,结果也会是0x29B1,说明代码匹配。

四、与 C# 串口通信结合使用

在之前的串口收发代码中,可直接调用该 CRC 工具类,实现 “数据 + CRC” 的收发校验:

示例:串口发送时附加 CRC

csharp

运行

// 待发送的原始数据 string originalData = "Hello HC32L130"; byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(originalData); // 计算CRC16 ushort crc = Hc32L130Crc16.Calculate(dataBytes); // 将CRC转换为2字节(注意字节序:与MCU一致,通常是高位在前/低位在前,需和硬件约定) byte[] crcBytes = BitConverter.GetBytes(crc); if (BitConverter.IsLittleEndian) { Array.Reverse(crcBytes); // 若系统是小端,转为大端(匹配MCU的字节序) } // 拼接“数据+CRC” byte[] sendBytes = new byte[dataBytes.Length + crcBytes.Length]; Buffer.BlockCopy(dataBytes, 0, sendBytes, 0, dataBytes.Length); Buffer.BlockCopy(crcBytes, 0, sendBytes, dataBytes.Length, crcBytes.Length); // 串口发送(参考之前的串口代码) serialPort.Write(sendBytes, 0, sendBytes.Length);

示例:串口接收时验证 CRC

// 假设接收的字节数组是recvBytes(包含“数据+2字节CRC”) byte[] dataPart = new byte[recvBytes.Length - 2]; Buffer.BlockCopy(recvBytes, 0, dataPart, 0, dataPart.Length); // 提取接收到的CRC byte[] recvCrcBytes = new byte[2]; Buffer.BlockCopy(recvBytes, dataPart.Length, recvCrcBytes, 0, 2); if (BitConverter.IsLittleEndian) { Array.Reverse(recvCrcBytes); // 转为系统端序 } ushort recvCrc = BitConverter.ToUInt16(recvCrcBytes, 0); // 计算数据部分的CRC并验证 ushort calcCrc = Hc32L130Crc16.Calculate(dataPart); if (calcCrc == recvCrc) { Console.WriteLine("CRC验证通过,数据完整!"); } else { Console.WriteLine("CRC验证失败,数据可能损坏!"); }

五、注意事项

  1. 字节序一致性:CRC 结果的字节序(高位在前 / 低位在前)需与 MCU 约定一致,否则会出现校验失败。
  2. 编码一致性:串口收发的字符串编码(如 UTF8/GBK)需与 MCU 侧保持一致,避免数据字节错误。
  3. 数据完整性:若串口接收的是长数据,需先拼接完整报文,再提取 “数据 + CRC” 进行校验。
http://www.jsqmd.com/news/95176/

相关文章:

  • Ada 语言的英文数字验证码识别系统设计与实现
  • 微PE下挂载外部硬盘运行ACE-Step大数据集训练实验
  • Bypass Paywalls Clean完整使用教程:快速解锁全网付费内容
  • 算法基础-(单调队列)
  • 用 Fortran 实现英文数字验证码识别系统
  • 【USTB期末复习】人工智能通识(理工版)
  • 低成本运行210亿参数模型?GPT-OSS-20B在16GB内存设备上的实践
  • 用 Pascal 实现英文数字验证码识别系统
  • 测试与发布(Alpha版本)
  • One Year Launch X431 PAD III/PAD V Online Software Update: Accurate EU/American Vehicle Diagnostics
  • 利用Ollama下载Qwen3-8B并构建私有化AI服务
  • 2025年12月模特培训公司综合实力排行榜:十大机构深度评测与选择指南 - 十大品牌推荐
  • MouseClick自动化点击工具技术解析与应用指南
  • 一种基于 Service Worker 的渐进式渲染方案的基本原理
  • 谷歌镜像加速下载Qwen-Image-Edit-2509模型参数文件
  • 如何在Ollama中部署Qwen3-14B模型?详细步骤说明
  • GPT-5.2超强性能解析:程序员必备的大模型学习资源
  • TV Bro:重新定义电视端网页浏览体验的智能浏览器
  • 微PE官网同款推荐!HunyuanVideo-Foley模型运行环境快速搭建工具包
  • 别再“苦力”写后台,Spec Coding “跑” 起来
  • 17篇FedDAT: An Approach for Foundation Model Finetuning in MultiModalHeterogeneous Federated Learning
  • Font Awesome 图标讲解
  • Stable Diffusion 3.5 FP8支持多卡并行吗?实测双GPU扩展性表现
  • SQLPad缓存优化技巧:让你的查询速度飙升300%
  • 如何实现流式输出?一篇文章手把手教你!
  • LeetCode Hot 100 - 盛水最多的容器解题思路详解
  • ACE-Step适配国产操作系统:推动开源音乐AI生态发展
  • Font Awesome 品牌图标
  • LeetCode Hot100 接雨水解题思路详解
  • FLUX.1-dev多模态模型实战:从git下载到Docker Compose一键启动