news 2026/8/27 13:10:55

Arduino与STM32的CRC16校验计算源码:支持Modbus协议与自定义功能的通用解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Arduino与STM32的CRC16校验计算源码:支持Modbus协议与自定义功能的通用解决方案

Arduino,stm32的crc16校验计算源码,支持crc16/modbus,自定义等功能。

撸代码的兄弟肯定都遇到过数据校验的问题,尤其是玩嵌入式开发的时候。今天咱们来聊聊CRC16校验在Arduino和STM32上的花式操作。别被那些复杂的数学公式吓到,直接上能跑的真代码。

先扔个查表法的实现镇场子:

const uint16_t crc16_table[] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, //...完整表太长,自己生成或找现成的 }; uint16_t crc16_calculate(uint8_t *data, uint16_t len) { uint16_t crc = 0xFFFF; while(len--) { crc = (crc >> 8) ^ crc16_table[(crc ^ *data++) & 0xFF]; } return crc; }

这段代码的精髓在查表加速。注意那个异或操作——初始值0xFFFF是Modbus的特色,要是玩别的协议记得改初始值。每次处理一个字节直接查表,比硬算快十倍不止。

想要支持Modbus协议?加点料:

uint16_t crc16_modbus(uint8_t *data, uint16_t len) { uint16_t crc = 0xFFFF; for(uint16_t i=0; i<len; i++){ crc ^= data[i]; for(int j=0; j<8; j++){ if(crc & 0x0001) { crc = (crc >> 1) ^ 0xA001; // 0x8005反转后的多项式 } else { crc >>= 1; } } } return crc; }

这里用了逐位计算的方式,注意多项式被反转了(Modbus标准操作)。那个0xA001其实是0x8005按位反转后的结果,别傻乎乎直接用标准多项式,会翻车。

玩STM32的兄弟可以试试硬件CRC外设:

uint16_t stm32_crc16(uint8_t *data, uint32_t len) { CRC->CR |= CRC_CR_RESET; // 复位寄存器 for(uint32_t i=0; i<len; i++){ *((__IO uint8_t *)&CRC->DR) = data[i]; // 字节写入 } return (CRC->DR & 0xFFFF) ^ 0xFFFF; // Modbus需要异或 }

F4系列实测能用,但注意硬件CRC的多项式可能和标准不同。这里最后那个异或0xFFFF就是用来适配Modbus的特殊处理,不用硬件加速的话可以删掉。

自定义参数才是真需求:

typedef struct { uint16_t poly; uint16_t init; bool refin; bool refout; uint16_t xorout; } CRC16_Config; uint16_t custom_crc16(uint8_t *data, uint16_t len, CRC16_Config cfg) { uint16_t crc = cfg.init; while(len--) { uint8_t c = *data++; if(cfg.refin) c = __RBIT(c) >> 24; // 位反转 crc ^= (c << 8); for(int i=0; i<8; i++){ crc = (crc & 0x8000) ? (crc << 1) ^ cfg.poly : (crc << 1); } } if(cfg.refout) crc = (crc << 8) | (crc >> 8); // 字节反转 return crc ^ cfg.xorout; }

这个模板够你玩转各种魔改CRC了。RBIT是STM32的指令级位反转,其他平台可以自己实现。注意多项式方向——左移还是右移决定了计算方向。

实测数据验证很重要:

void test() { uint8_t test_data[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02}; // Modbus CRC16应该返回0xC40B uint16_t crc = crc16_modbus(test_data, sizeof(test_data)); Serial.print("CRC16: 0x"); Serial.println(crc, HEX); }

跑这个测试用例,如果串口打印出C40B,恭喜你算法写对了。要是出问题,先检查字节顺序——Modbus是低位在前高位在后,别搞反了。

最后提醒:查表法在STM32上能起飞,但Arduino空间吃紧的话还是用逐位计算。遇到校验失败别慌,八成是多项式方向或初始值没设对。收藏这几个代码片段,够应付大多数嵌入式项目的校验需求了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 15:00:06

多元统计分析不会做?R语言带你玩转生态数据,快速出图出结果

第一章&#xff1a;R 语言 多元统计分析 生态数据在生态学研究中&#xff0c;多元统计分析是探索物种分布、环境因子影响以及群落结构变化的重要工具。R 语言凭借其强大的统计计算能力和丰富的生态学相关包&#xff08;如 vegan、ade4、labdsv&#xff09;&#xff0c;成为处理…

作者头像 李华
网站建设 2026/8/21 13:35:12

大模型开发必看!从“造Agent“到“炼技能“:顶尖公司都在悄悄转型的秘密,小白也能秒懂!

在AI Agent爆发的当下&#xff0c;行业正面临“智能体动物园”的管理困境。本文深度解析为何顶尖AI公司开始转向“Skills”范式——通过将知识沉淀为标准化、可组合的技能资产&#xff0c;替代单纯的智能体数量堆砌&#xff0c;从而实现真正的企业级自动化落地。 一、从“AI Ag…

作者头像 李华
网站建设 2026/8/22 15:19:20

20251231_174635_面向未来的_Agent_平台工程:架构探索与设计哲学

引言&#xff1a;从“炼丹”到“工业化” 在生成式 AI 的浪潮中&#xff0c;我们正处于一个关键的转折点。过去一年&#xff0c;学习力爆棚的开发者们已经习惯于在chatbox 中“手搓” Prompt&#xff0c;或者通过简单的 API 调用构建 Chatbot&#xff0c;或者拖拉拽完成一个简单…

作者头像 李华
网站建设 2026/8/27 10:02:42

掌握这5种R语言技术,轻松搞定复杂生态数据多元分析

第一章&#xff1a;R语言在生态多元分析中的核心价值R语言已成为生态学研究中多元数据分析的首选工具&#xff0c;凭借其强大的统计计算能力和丰富的扩展包生态&#xff0c;为群落结构、环境梯度和物种多样性等复杂生态问题提供了系统性解决方案。灵活的数据处理与可视化能力 R…

作者头像 李华
网站建设 2026/8/24 12:05:19

Markdown文档编写规范:记录YOLOv8实验过程的最佳方式

Markdown文档编写规范&#xff1a;记录YOLOv8实验过程的最佳方式 在深度学习项目中&#xff0c;最让人头疼的往往不是模型跑不起来&#xff0c;而是三个月后自己回来翻记录时发现——“这实验到底怎么做的&#xff1f;参数改了啥&#xff1f;结果还能复现吗&#xff1f;” 尤其…

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

【空间计量经济学前沿】:利用R语言实现空间滞后与误差模型的终极对比

第一章&#xff1a;R语言空间自相关数据建模概述在地理信息系统与空间数据分析领域&#xff0c;空间自相关是衡量空间现象分布模式的重要统计特性。它描述的是地理位置相近的观测值在数值上是否具有相似性或依赖性。R语言凭借其强大的统计计算能力和丰富的空间分析扩展包&#…

作者头像 李华