news 2026/4/15 15:22:42

C#实现HC32L130 CRC16校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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” 进行校验。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 18:23:58

Nginx缓存静态资源提升ACE-Step Web界面访问速度

Nginx 缓存静态资源提升 ACE-Step Web 界面访问速度 在 AI 音乐创作工具逐渐走向大众的今天&#xff0c;用户体验不再仅仅取决于模型生成能力&#xff0c;更与前端响应速度息息相关。以 ACE-Step 为例——这款由 ACE Studio 与阶跃星辰联合推出的开源音乐生成模型&#xff0c;凭…

作者头像 李华
网站建设 2026/4/15 13:01:32

跨平台标签打印革命:1个工具搞定Windows、macOS、Linux三大系统

跨平台标签打印革命&#xff1a;1个工具搞定Windows、macOS、Linux三大系统 【免费下载链接】lprint A Label Printer Application 项目地址: https://gitcode.com/gh_mirrors/lp/lprint 技术前沿&#xff1a;IPP Everywhere™协议驱动的零配置打印新时代 在现代数字化…

作者头像 李华
网站建设 2026/4/14 19:58:43

[19] Remove Nth Node From End of List 删除链表的倒数第N个节点

[19] Remove Nth Node From End of List 力扣题目链接 1. 快慢指针 1.1 思想 使用快慢指针一趟扫描&#xff0c;找到待删除节点的前驱节点。 创建两个指针 fast 和 slow&#xff0c;都初始化为 dummyHead。建立距离: 让 fast 指针先向前移动 n 步。此时&#xff0c;fast 和…

作者头像 李华
网站建设 2026/4/14 16:11:07

Font Awesome 品牌图标

Font Awesome 品牌图标&#xff08;Brands Icons&#xff09;详解 Font Awesome 的 Brands Icons 是专门用于展示知名品牌、公司、社交媒体、软件和技术平台的图标集合。这些图标都是矢量形式&#xff0c;基于官方商标设计&#xff0c;但 Font Awesome 强调&#xff1a;所有品…

作者头像 李华
网站建设 2026/4/2 18:02:14

SQLite Studio终极指南:一站式数据库管理解决方案

SQLite Studio终极指南&#xff1a;一站式数据库管理解决方案 【免费下载链接】sqlite-studio SQLite database explorer 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-studio 在数据驱动的时代&#xff0c;高效管理SQLite数据库成为开发者和数据分析师的必备技…

作者头像 李华
网站建设 2026/4/7 8:18:27

SQLPad查询结果缓存终极配置技巧:让你的重复查询速度提升10倍

SQLPad查询结果缓存终极配置技巧&#xff1a;让你的重复查询速度提升10倍 【免费下载链接】sqlpad Web-based SQL editor. Legacy project in maintenance mode. 项目地址: https://gitcode.com/gh_mirrors/sq/sqlpad 还在为SQLPad中重复查询的缓慢响应而烦恼吗&#xf…

作者头像 李华