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
*pushMsg++
改为
*(pushMsg++)
试试 LcwSwust 发表于 2020-12-16 13:06
*pushMsg++
改为
*(pushMsg++)
一样的 @**NT018 本帖最后由 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
wh6ic 发表于 2020-12-16 16:22
//unsigned int CRC (unsigned char bytedata, unsigned int crcdata);
_CRC: ;input--> [ ...
谢谢,已解决,是程序的问题 本想上传1个程序,解决了就好。 谭翬 发表于 2020-12-17 11:11
本想上传1个程序,解决了就好。
谢谢! 您好,stc modbus程序能发送一个参考下么,1982937939@qq.com
页:
[1]