cainiao518 发表于 2020-12-16 11:27

STC计算CRC16有问题?

本帖最后由 cainiao518 于 2020-12-16 13:07 编辑

      TX1_Buffer=0x00;
      TX1_Buffer=0x01;
      TX1_Buffer=0x03;
      TX1_Buffer=0x04;
      TX1_Buffer=0x00;
      TX1_Buffer=0x04;
      TX1_Buffer=0x00;
      TX1_Buffer=0x02;
      run_cnt=Calculate_CRC(TX1_Buffer,8); //计算CRC16
      TX1_Buffer=run_cnt>>8;
      TX1_Buffer=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;         //以异或后的数据做下标,查出数据后与CRC低位异或后,放入      CRC高位
                uchCRCLo = auchCRCLo ;                                  //以异或后的数据做下标,查出数据后与CRC低位异或后,放入 CRC低位
   }
   uIndex=      uchCRCHi;
   uIndex<<=8;
   uIndex|= uchCRCLo;
   return (uIndex);                              //返回CRC16
}
/* CRC 高位字节值表 */
xdata u8auchCRCHi[] = {
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 u8auchCRCLo[] = {
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

@**NT018

wh6ic 发表于 2020-12-16 16:22

本帖最后由 wh6ic 于 2020-12-16 16:25 编辑

//unsigned int      CRC (unsigned char bytedata, unsigned int crcdata);
_CRC:      ;input--> = CRC_H, CRC_L,R7 = updata
      ;output --> = 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
      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

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
页: [1]
查看完整版本: STC计算CRC16有问题?