当前位置: 首页 > 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.cnnetsun.cn/news/71364.html

相关文章:

  • 微PE官网同款推荐!HunyuanVideo-Foley模型运行环境快速搭建工具包
  • LeetCode Hot 100 - 盛水最多的容器解题思路详解
  • Windows驱动管理革命:Driver Store Explorer全面实战指南
  • Get-cookies.txt-LOCALLY:本地Cookie导出终极指南,隐私安全无忧
  • 云原生API网关认证终极指南:5步搞定Hydra+APISIX高可用集成
  • 文件哈希值批量修改新方案:告别传统计算的效率革命
  • Beyond Compare 5完整使用指南:三步实现免费授权
  • ComfyUI-Manager终极指南:一键配置AI绘画管理平台
  • 如何快速获取网盘文件真实下载地址?2025年最实用的网盘直链工具推荐
  • Redis过期键管理终极技巧:AnotherRedisDesktopManager可视化监控实战
  • 知识星球内容数字化归档:从信息流到结构化知识库的技术实践
  • NatTypeTester终极指南:3分钟快速诊断网络NAT类型,彻底解决游戏卡顿和视频会议延迟问题
  • Tsuru容器平台架构深度解析:企业级PaaS部署实战指南
  • GHelper终极指南:7步解锁华硕ROG笔记本隐藏性能
  • ACE-Step适配国产操作系统:推动开源音乐AI生态发展
  • 智能健康数据管理2025终极指南:免费多平台步数同步完整方案
  • 5分钟搭建Sunshine游戏串流:免费开源让全家共享游戏乐趣
  • 智能对话系统构建指南:5步搭建企业级微信机器人
  • HunyuanVideo-Foley + OpenCV 实现视频帧分析与音效精准匹配
  • 突破Windows权限天花板:5分钟掌握TrustedInstaller特权获取技巧
  • arp-scan局域网设备发现工具完全使用手册
  • 阴阳师脚本一键安装指南:告别手动肝游戏的终极解决方案
  • Windows虚拟显示器完整指南:免费扩展多屏工作空间
  • Windows 11远程桌面多用户终极解决方案:RDP Wrapper完整配置手册
  • 3分钟掌握Windows虚拟显示器:打造无限工作空间的终极指南
  • Transformer模型详解进阶:Qwen3-VL-30B的结构创新点剖析
  • 4个查AI率工具和2个降ai工具效果测评,分分钟AI率降到个位数!
  • 4个查AI率工具和2个降ai工具效果测评,AI率降到10%!
  • 1111111111111
  • 【办公类-18-07】20251215(Python)“口腔检查涂氟信息”批量生成打印(区名、学号、姓名、学校、班级、身份证、户籍、性别、民族)