[STC单片机] STC计算CRC16有问题?

[复制链接]
1305|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;
  1. u16 Calculate_CRC(u8 *pushMsg,u16 usDataLen)
  2. {
  3.    u8 uchCRCHi=0xFF;           /*高CRC字节初始化*/
  4.    u8 uchCRCLo=0xFF;           /*低CRC 字节初始化*/
  5.    u16 uIndex;                   /*CRC循环中的索引*/
  6.    while (usDataLen--)            /*传输消息缓冲区*/
  7.    {
  8.         uIndex   = uchCRCHi ^ *pushMsg++; /* 计算CRC 将消息帧数据与CRC高位异或 */
  9.                 uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];         //以异或后的数据做下标,查出数据后与CRC低位异或后,放入        CRC高位
  10.                 uchCRCLo = auchCRCLo[uIndex] ;                                  //以异或后的数据做下标,查出数据后与CRC低位异或后,放入 CRC低位
  11.    }
  12.    uIndex=        uchCRCHi;
  13.    uIndex<<=8;
  14.    uIndex|= uchCRCLo;
  15.    return (uIndex);                                //返回CRC16
  16. }
  1. /* CRC 高位字节值表 */
  2. xdata u8  auchCRCHi[] = {
  3. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  4. 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  5. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
  6. 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  7. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
  8. 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  9. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
  10. 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  11. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  12. 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  13. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
  14. 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  15. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  16. 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  17. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
  18. 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  19. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  20. 0x40,
  21. };

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

评论

验证过,合格  发表于 2020-12-16 16:23
 楼主| cainiao518 发表于 2020-12-16 16:38 | 显示全部楼层
wh6ic 发表于 2020-12-16 16:22
//unsigned int        CRC (unsigned char bytedata, unsigned int crcdata);
_CRC:        ;input  --> [ ...

谢谢,已解决,是程序的问题
谭翬 发表于 2020-12-17 11:11 | 显示全部楼层
本想上传1个程序,解决了就好。
 楼主| cainiao518 发表于 2020-12-17 15:33 | 显示全部楼层
谭翬 发表于 2020-12-17 11:11
本想上传1个程序,解决了就好。

谢谢!
annaizf 发表于 2021-3-1 10:13 | 显示全部楼层
您好,stc modbus程序能发送一个参考下么,1982937939@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

1431

帖子

4

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