打印

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

[复制链接]
3961|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 | 只看该作者
我就是用的上面的算法,只是不知道,查表的算法是如何得来的。

使用特权

评论回复
5
huanghuac| | 2010-5-26 19:03 | 只看该作者
没用过……

使用特权

评论回复
6
airwill| | 2010-5-28 14:34 | 只看该作者
哈哈, 手工模拟地计算一下, 很快你会找到规律, 借这个规律, 就能知道这个表是怎么算出来的了

使用特权

评论回复
7
henglin| | 2016-9-2 15:47 | 只看该作者

使用特权

评论回复
8
billypeng| | 2016-9-11 21:29 | 只看该作者
Crc算法属于数学问题,工程师只要会用就可以了。工程师应着眼于解决工程问题。

使用特权

评论回复
9
hotpower| | 2018-12-30 01:44 | 只看该作者

使用特权

评论回复
10
nethopper| | 2019-3-30 13:49 | 只看该作者
CRC查表法速度快,常用在数据采集量大的PLC程序里,以满足上位机采集大块数据的频度(Polling Frequency)要求。

使用特权

评论回复
11
syqueer| | 2019-4-8 15:20 | 只看该作者
大叔

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

68

主题

585

帖子

3

粉丝