外观
CRC 校验
可在工程屏参配置中开启 CRC。启用后,每条指令帧尾追加 2 字节 CRC 校验码。
计算规则
| 项 | 说明 |
|---|---|
| 是否启用 | 屏参配置中自定义 |
| 参与计算的字节 | 指令码及之后的数据(含起始地址、数据长度、数据内容等) |
| 不参与计算 | 指令帧头、指令长度 |
| 算法 | ANSI-16,多项式 (X^{16}+X^{15}+X^{2}+1) |
| 结果 | 双字节。本页 C 函数返回值按高字节、低字节依次附在帧尾(返回 0x1824 则附加 18 24)。通用 Modbus CRC 工具若显示 0x2418,线上字节序相同(先发低字节 18) |
启用 CRC 后,指令长度字段须计入尾部的 2 字节 CRC(即长度 = 指令及之后所有内容,含 CRC)。
举例
向寄存器 0x03、0x04 连续写入 0x00、0x01,并带 CRC:
text
发送:A5 5A 06 80 03 00 01 18 24| 定义 | 帧头 | 指令长度 | 指令 | 起始地址 | 数据内容 | CRC |
|---|---|---|---|---|---|---|
| 举例 | A5 5A | 06 | 80 | 03 | 00 01 | 18 24 |
对 80 03 00 01 计算 CRC:本页 CRC16() 返回 0x1824,帧尾附加 18 24。帧头与长度 06 不参与计算。对比无 CRC 写法 A5 5A 04 80 03 00 01,启用后长度由 04 变为 06。
CRC 结果应答
若同时启用「CRC 校验」与「CRC 校验结果应答」(均在屏参中设置),屏在校验后主动外发结果帧:
| 定义 | 帧头 | 数据长度 | 指令 | 数据 | CRC |
|---|---|---|---|---|---|
| 长度(字节) | 2 | 1(固定 0x02) | 1 | 1 | 2 |
| 说明 | 用户自定义 | 固定 0x02 | 收到的原指令码 | 0xFF=正确,0x00=错误 | 本应答帧的 CRC |
举例:
text
A5 5A 02 80 FF 20 30表示对指令 0x80 的校验结果为正确(FF),应答自身 CRC 为 20 30。
实现参考(C)
查表法实现时,需两张 256 字节的 auchCRCHi[] / auchCRCLo[] 表。完整表较长,实现时请从官方《VGUS 串口屏用户开发指南》§2.5 复制查表数组,或展开下方折叠区。
函数骨架(与指南一致):
c
uint8_t uchCRCHi; // CRC 高字节
uint8_t uchCRCLo; // CRC 低字节
/* 另需 static 查表 auchCRCHi[256]、auchCRCLo[256],见开发指南或下方折叠 */
uint16_t CRC16(uint8_t *pMsg, uint16_t Len)
{
uint8_t i;
uchCRCHi = 0xFF;
uchCRCLo = 0xFF;
while (Len--) {
i = uchCRCHi ^ (*pMsg++);
uchCRCHi = uchCRCLo ^ auchCRCHi[i];
uchCRCLo = auchCRCLo[i];
}
return (uchCRCHi << 8) | uchCRCLo;
}对参与校验的缓冲区调用 CRC16,将返回值按高、低字节依次附在帧尾(返回 0x1824 则附加 18 24)。
完整 CRC 查表(auchCRCHi / auchCRCLo)
以下内容摘自开发指南,便于拷贝进工程;若与最新指南不一致,以官方 PDF 为准。
c
static uint8_t auchCRCHi[] = { /* CRC 高位字节值表 */
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
};
static uint8_t auchCRCLo[] = { /* CRC 低位字节值表 */
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
};