modbus crc16这种算法,是怎么算的!

[复制链接]
5914|10
 楼主| ccxlslr 发表于 2010-5-20 19:46 | 显示全部楼层 |阅读模式
uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
{
       uint8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
       uint8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
       uint32 uIndex ; /* CRC循环中的索引 */
       while (usDataLen--) /* 传输消息缓冲区 */
       {
            uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
            uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
            uchCRCLo = auchCRCLo[uIndex] ;
       }
       return (uchCRCHi << 8 | uchCRCLo) ;
}

当然,这个算法,还带两个分别为256字节的数组。
我只知道那种动态的算法,很想知道这种算法的过程,还望高手指点。
BitFu 发表于 2010-5-25 10:35 | 显示全部楼层
uint16_t mbCRC16( uint8_t * pucFrame, uint16_t usLen )
{
   uint8_t hi,lo;
   uint16_t i;
   uint16_t crc;
   crc=0xFFFF;
   for (i=0;i<usLen;i++)
   {
     crc= _crc16_update(crc, *pucFrame);
     pucFrame++;
   }
  hi=crc%256;
  lo=crc/256;
  crc=(hi<<8)|lo;
  return crc;
}
这个是不用数组的算法,但是这个执行起来要慢一些。
BitFu 发表于 2010-5-25 10:38 | 显示全部楼层
uint16_t
    crc16_update(uint16_t crc, uint8_t a)
    {
        int i;

        crc ^= a;
        for (i = 0; i < 8; ++i)
        {
            if (crc & 1)
                crc = (crc >> 1) ^ 0xA001;
            else
                crc = (crc >> 1);
        }

        return crc;
    }
这个是上面程序调用的函数。
 楼主| ccxlslr 发表于 2010-5-26 18:56 | 显示全部楼层
我就是用的上面的算法,只是不知道,查表的算法是如何得来的。
huanghuac 发表于 2010-5-26 19:03 | 显示全部楼层
没用过……
airwill 发表于 2010-5-28 14:34 | 显示全部楼层
哈哈, 手工模拟地计算一下, 很快你会找到规律, 借这个规律, 就能知道这个表是怎么算出来的了
henglin 发表于 2016-9-2 15:47 | 显示全部楼层
billypeng 发表于 2016-9-11 21:29 | 显示全部楼层
Crc算法属于数学问题,工程师只要会用就可以了。工程师应着眼于解决工程问题。
hotpower 发表于 2018-12-30 01:44 来自手机 | 显示全部楼层
nethopper 发表于 2019-3-30 13:49 | 显示全部楼层
CRC查表法速度快,常用在数据采集量大的PLC程序里,以满足上位机采集大块数据的频度(Polling Frequency)要求。
syqueer 发表于 2019-4-8 15:20 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:电位器,可调电阻,微调电阻就选BOURNS 3362 带刻度,温漂小于100ppm/℃。 http://www.szlcsc.com/search/global.html&global_search_keyword=3362%2520BOURNS

68

主题

588

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部