news 2026/2/18 7:03:55

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/2/10 17:00:42

纯前端Word生成利器:DOCX.js浏览器端文档创建教程

纯前端Word生成利器&#xff1a;DOCX.js浏览器端文档创建教程 【免费下载链接】DOCX.js Generate Microsoft Word DOCX files in pure client-side JavaScript. Try in Chrome 项目地址: https://gitcode.com/gh_mirrors/do/DOCX.js 还在为网页应用中的文档导出功能而烦…

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

Joy-Con Toolkit终极指南:全面掌握手柄自定义与优化

Joy-Con Toolkit终极指南&#xff1a;全面掌握手柄自定义与优化 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款功能强大的开源手柄控制工具&#xff0c;专为任天堂Joy-Con手柄设计开发。这…

作者头像 李华
网站建设 2026/2/13 7:51:00

在线UML绘图终极指南:5分钟学会PlantUML Editor快速上手

在线UML绘图终极指南&#xff1a;5分钟学会PlantUML Editor快速上手 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 还在为绘制UML图而烦恼吗&#xff1f;PlantUML Editor这款在线UML绘图…

作者头像 李华
网站建设 2026/2/10 12:01:59

【RL 】Ray 支持RDMA

https://www.anyscale.com/blog/ray-direct-transport-rdma-support-in-ray-core 长话短说 (tl;dr): Ray 直接传输 (Ray Direct Transport) 功能通过基于 RDMA 的传输方式&#xff0c;在 Ray 中实现了快速、直接的 GPU 数据传输。本文将介绍如何使用其 API 来构建分布式系统&am…

作者头像 李华
网站建设 2026/2/15 2:56:29

dnSpy异常调试实战:从空引用定位到堆栈深度分析

dnSpy异常调试实战&#xff1a;从空引用定位到堆栈深度分析 【免费下载链接】dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy 在.NET开发中&#xff0c;你是否经常遇到"未将对象引用设置到对象的实例"这类看似简单却难以定位的异常&#xff1f;面…

作者头像 李华
网站建设 2026/2/11 0:14:09

JavaScript性能优化实战:从瓶颈识别到极致体验

JavaScript性能优化实战&#xff1a;从瓶颈识别到极致体验 在现代 Web 开发中&#xff0c;JavaScript 已成为前端交互的核心。然而&#xff0c;随着业务逻辑日益复杂和用户对页面性能的要求不断提高&#xff0c;JavaScript 的性能优化显得尤为重要。本文将从实际开发角度出发&a…

作者头像 李华