目录

一、适用场景

二、CRC表

三、CRC校验程序


一、适用场景

C程序Modbus-RTU的CRC校验。

二、CRC表

uint8_t const CRC_H[] =
{0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40
};
uint8_t const CRC_L[] =
{0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,0x41, 0x81, 0x80, 0x40
};

说明:51单片机,请把“uint8_t const”换成“unsigned char code”。

三、CRC校验程序

/** 功能:完成CRC校验* 输入: @crc_long:参与校验的字节长度*       @p_crc_data:校验数据首指针地址* 输出: 校验结果*/
uint16_t CRC16_Modbus(uint8_t crc_long, uint8_t* p_crc_data)
{uint8_t i = 0;uint8_t crc_buffer = 0x00;uint8_t crc_value_h = 0xff;uint8_t crc_value_l  = 0xff;uint16_t  crc_value_buffer = 0x0000;for(i = 0;i < crc_long;i ++)                            //循环校验所有字节长度{crc_buffer = crc_value_l ^ (*p_crc_data);           crc_value_l = crc_value_h ^ CRC_H[crc_buffer];crc_value_h = CRC_L[crc_buffer];p_crc_data ++;                                      //指针+1}crc_value_buffer = crc_value_h;crc_value_buffer <<= 8;crc_value_buffer |= crc_value_l;return crc_value_buffer;                                //返回CRC值
}

说明:51单片机,请把“uint8_t”换成“unsigned char”、“uint16_t”换成“unsigned int”。

Modbus-RTU查表法的CRC校验相关推荐

  1. 常用crc查表法_查表法计算CRC

    (查表法)CRC检验码的计算过程 (1)将上次计算出的CRC校验码右移一个字节: (2)将移出的这个字节与新的要校验的字节进行XOR 运算: (3)用运算出的值在预先生成码表中进行索引,获取对应的值( ...

  2. crc16modbus查表法_查表法计算CRC16校验值

    /******************************************************************************* * Copyright (c) 201 ...

  3. crc16码表的使用_查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  4. 常用crc查表法_请教查表法计算CRC的原理

    自己写过的, 希望对你有帮助 Cyclic Redundancy Check(CRC) 原理及实现 /// 1: 需求 在数据传送过程中,为了能够进行错误检测, 往往在数据后追加一些检测码, 当接受方 ...

  5. VS 2019 MFC CRC16校验算法例程总结(计算法/查表法以及CRC16校验表自动生成)

            工程需要,根据网上例程对CRC16校验方法进行了总结.CRC16为通讯领域常用的校验算法,其原理想必大家都很清楚.下面为相关的总结和封装类代码.被例程将CRC16校验的方法分为及算法和 ...

  6. 查表法实现CRC16校验

    //CRC高位字节值表 const uint8_t auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0 ...

  7. 【基础知识】CRC(循环冗余校验)直接计算和查表法

    CRC概述 校验 校验是什么,个人理解就是经过一个算法,使用大量数据(几MB的数据)生成较小长度的一串信息(如16Bit),并切要做到 原数据不同时,生成的信息大概率不同(不是加密算法不考虑刻意造数据 ...

  8. 【转载】CRC32校验算法C语言版(查表法)

    先放原文链接:CRC32校验算法C语言版(查表法) 这几天搞串口通信,用到CRC32,把以前用到的东西整理一下,方便以后使用. STM32F103 芯片自带的CRC32硬件算法,匹配上位机CRC32算 ...

  9. 常用crc查表法_CRC校验码简介及CRC16的计算方法

    点击上方"嵌入式从0到1",选择"置顶/星标公众号" 干货福利,第一时间送达! 什么是CRC校验? CRC即循环冗余校验码(Cyclic Redundancy ...

最新文章

  1. 直播回顾|结构光3D相机光机核心技术及3D成像性能分析
  2. python拼接sql语句_【Python】拼接MySQL常用语句
  3. sphinx搜索结果按权重排序php,Sphinx Ranking Mode(排序模式) (翻译)
  4. andriod 多个Activity之间共享数据
  5. [蓝桥杯2015决赛]五星填数-枚举+数论
  6. Lombok,自动值和不可变项
  7. 教你如何玩转GitHub
  8. C++11多线程之 std::packaged_task
  9. 【数据分析入门】R语言绘图语句总结
  10. 博主自我介绍、当前已经成立的技术分局【专栏必读】
  11. jupyter代码无法运行
  12. 去掉磁盘写保护小技巧
  13. thinkpad x200 bios 超级密码破解方法
  14. websocket 服务器外网访问
  15. 学习图神经网络相关内容
  16. 温度变送器转换程序c语言,两线制智能温度变送器的设计
  17. Android 压缩优化apk
  18. ElasticSearch如何不分词完全匹配搜索
  19. php 模拟蜘蛛,PHP模拟百度蜘蛛,伪造IP爬行网站,附源代码
  20. 分享文件的另一种选择--Firefox Send

热门文章

  1. Jasperreports的XSD翻译
  2. js实现简单聊天页面,图片随机名字随机
  3. Eclipse断点调试(debug)
  4. 拷贝mongodb数据库
  5. fitness0417胸
  6. 基于OV7725的STM32图像监控系统设计1-硬件原理图设计
  7. 实施需要掌握的linux命令,开发人员需要掌握的日常Linux命令集
  8. DNS轮询,一个域名配多个IP实现负载均衡的研究
  9. 绘声绘影X9 - 基础操作(2)
  10. 【美团HD】Detail详情页