打印
[STC单片机]

STC计算CRC16有问题?

[复制链接]
1049|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cainiao518|  楼主 | 2020-12-16 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cainiao518 于 2020-12-16 13:07 编辑

        TX1_Buffer[0]=0x00;
        TX1_Buffer[1]=0x01;
        TX1_Buffer[2]=0x03;
        TX1_Buffer[3]=0x04;
        TX1_Buffer[4]=0x00;
        TX1_Buffer[5]=0x04;
        TX1_Buffer[6]=0x00;
        TX1_Buffer[7]=0x02;
        run_cnt=Calculate_CRC(TX1_Buffer,8); //计算CRC16
        TX1_Buffer[8]=run_cnt>>8;
        TX1_Buffer[9]=run_cnt&0xff;
u16 Calculate_CRC(u8 *pushMsg,u16 usDataLen)
{
   u8 uchCRCHi=0xFF;           /*高CRC字节初始化*/
   u8 uchCRCLo=0xFF;           /*低CRC 字节初始化*/
   u16 uIndex;                   /*CRC循环中的索引*/
   while (usDataLen--)            /*传输消息缓冲区*/
   {
        uIndex   = uchCRCHi ^ *pushMsg++; /* 计算CRC 将消息帧数据与CRC高位异或 */
                uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];         //以异或后的数据做下标,查出数据后与CRC低位异或后,放入        CRC高位
                uchCRCLo = auchCRCLo[uIndex] ;                                  //以异或后的数据做下标,查出数据后与CRC低位异或后,放入 CRC低位
   }
   uIndex=        uchCRCHi;
   uIndex<<=8;
   uIndex|= uchCRCLo;
   return (uIndex);                                //返回CRC16
}
/* CRC 高位字节值表 */
xdata u8  auchCRCHi[] = {
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,
};

/* CRC低位字节值表*/
xdata u8  auchCRCLo[] = {
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,
};
u8 *pushMsg;                   /*要进行CRC校验的消息*/
u16 usDataLen;         /*消息中字节数*/

STC8H1K08计算CRC16(00 01 03 04 00 04 00 02  )结果:0XD000
电脑软件计算CRC16(00 01 03 04 00 04 00 02  )结果:0X7139



使用特权

评论回复

相关帖子

沙发
LcwSwust| | 2020-12-16 13:06 | 只看该作者
*pushMsg++
改为
*(pushMsg++)
试试

使用特权

评论回复
板凳
cainiao518|  楼主 | 2020-12-16 13:17 | 只看该作者
LcwSwust 发表于 2020-12-16 13:06
*pushMsg++
改为
*(pushMsg++)

一样的

使用特权

评论回复
地板
cainiao518|  楼主 | 2020-12-16 13:48 | 只看该作者

使用特权

评论回复
5
wh6ic| | 2020-12-16 16:22 | 只看该作者
本帖最后由 wh6ic 于 2020-12-16 16:25 编辑

//unsigned int        CRC (unsigned char bytedata, unsigned int crcdata);
_CRC:        ;input  --> [r4,r5] = CRC_H, CRC_L,  R7 = updata
        ;output --> [r6,r7] = CRC_H, CRC_L
        mov        a, r4
        xrl        a, r7
        mov        r4, a                ; acc = Dx = CRC_H ^ updata
        mov        b, #0

        mov        c, p
        mov        b.0, c                ; b.0 = acc parity
        mov        c, acc.0
        mov        b.6, c                ; b.6 = a.0
        rrc        a
        xrl        a, r4
        mov        c, acc.0
        mov        b.7, c                ; b.7 = a.1 ^ a.0

        mov        a, b
        xrl        a, r5
        mov        r6, a                ;r6 = CRC_L ^ b
        mov        a, r4
        inc        a
        jnz        CRC_1
        mov        a, #0x40        ;补偿 MOVC 指令无法寻址最后一个字节
        sjmp        CRC_2
CRC_1:        lcall        CRC_T
CRC_2:        mov        r7, a                ;r7 = T_Lo[Dx]
        ret

CRC_T:        movc        a, @a + pc
        ret                        ;
        db        0x00, 0xC0, 0xC1, 0x01,  0xC3, 0x03, 0x02, 0xC2,  0xC6, 0x06, 0x07, 0xC7,  0x05, 0xC5, 0xC4, 0x04
        db        0xCC, 0x0C, 0x0D, 0xCD,  0x0F, 0xCF, 0xCE, 0x0E,  0x0A, 0xCA, 0xCB, 0x0B,  0xC9, 0x09, 0x08, 0xC8
        db        0xD8, 0x18, 0x19, 0xD9,  0x1B, 0xDB, 0xDA, 0x1A,  0x1E, 0xDE, 0xDF, 0x1F,  0xDD, 0x1D, 0x1C, 0xDC
        db        0x14, 0xD4, 0xD5, 0x15,  0xD7, 0x17, 0x16, 0xD6,  0xD2, 0x12, 0x13, 0xD3,  0x11, 0xD1, 0xD0, 0x10

        db        0xF0, 0x30, 0x31, 0xF1,  0x33, 0xF3, 0xF2, 0x32,  0x36, 0xF6, 0xF7, 0x37,  0xF5, 0x35, 0x34, 0xF4
        db        0x3C, 0xFC, 0xFD, 0x3D,  0xFF, 0x3F, 0x3E, 0xFE,  0xFA, 0x3A, 0x3B, 0xFB,  0x39, 0xF9, 0xF8, 0x38
        db        0x28, 0xE8, 0xE9, 0x29,  0xEB, 0x2B, 0x2A, 0xEA,  0xEE, 0x2E, 0x2F, 0xEF,  0x2D, 0xED, 0xEC, 0x2C
        db        0xE4, 0x24, 0x25, 0xE5,  0x27, 0xE7, 0xE6, 0x26,  0x22, 0xE2, 0xE3, 0x23,  0xE1, 0x21, 0x20, 0xE0

        db        0xA0, 0x60, 0x61, 0xA1,  0x63, 0xA3, 0xA2, 0x62,  0x66, 0xA6, 0xA7, 0x67,  0xA5, 0x65, 0x64, 0xA4
        db        0x6C, 0xAC, 0xAD, 0x6D,  0xAF, 0x6F, 0x6E, 0xAE,  0xAA, 0x6A, 0x6B, 0xAB,  0x69, 0xA9, 0xA8, 0x68
        db        0x78, 0xB8, 0xB9, 0x79,  0xBB, 0x7B, 0x7A, 0xBA,  0xBE, 0x7E, 0x7F, 0xBF,  0x7D, 0xBD, 0xBC, 0x7C
        db        0xB4, 0x74, 0x75, 0xB5,  0x77, 0xB7, 0xB6, 0x76,  0x72, 0xB2, 0xB3, 0x73,  0xB1, 0x71, 0x70, 0xB0

        db        0x50, 0x90, 0x91, 0x51,  0x93, 0x53, 0x52, 0x92,  0x96, 0x56, 0x57, 0x97,  0x55, 0x95, 0x94, 0x54
        db        0x9C, 0x5C, 0x5D, 0x9D,  0x5F, 0x9F, 0x9E, 0x5E,  0x5A, 0x9A, 0x9B, 0x5B,  0x99, 0x59, 0x58, 0x98
        db        0x88, 0x48, 0x49, 0x89,  0x4B, 0x8B, 0x8A, 0x4A,  0x4E, 0x8E, 0x8F, 0x4F,  0x8D, 0x4D, 0x4C, 0x8C
        db        0x44, 0x84, 0x85, 0x45,  0x87, 0x47, 0x46, 0x86,  0x82, 0x42, 0x43, 0x83,  0x41, 0x81, 0x80;, 0x40

使用特权

评论回复
评论
wh6ic 2020-12-16 16:23 回复TA
验证过,合格 
6
cainiao518|  楼主 | 2020-12-16 16:38 | 只看该作者
wh6ic 发表于 2020-12-16 16:22
//unsigned int        CRC (unsigned char bytedata, unsigned int crcdata);
_CRC:        ;input  --> [ ...

谢谢,已解决,是程序的问题

使用特权

评论回复
7
谭翬| | 2020-12-17 11:11 | 只看该作者
本想上传1个程序,解决了就好。

使用特权

评论回复
8
cainiao518|  楼主 | 2020-12-17 15:33 | 只看该作者
谭翬 发表于 2020-12-17 11:11
本想上传1个程序,解决了就好。

谢谢!

使用特权

评论回复
9
annaizf| | 2021-3-1 10:13 | 只看该作者
您好,stc modbus程序能发送一个参考下么,1982937939@qq.com

使用特权

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

本版积分规则

132

主题

1352

帖子

4

粉丝