1 1 0 0 0 1 0 1
整個“1”的數(shù)目是 4 個。如果便用了偶校驗,幀的奇偶校驗位將是 0,便得整個“1”的
個數(shù)仍是 4 個。如果便用了奇校驗,幀的奇偶校驗位將是 1,便得整個“1”的個數(shù)是 5 個。
如果沒有指定奇偶校驗位,傳輸時就沒有校驗位,也不進行校驗檢測。代替一附加的停止位填充至要傳輸?shù)淖址麕小?/span>
2、LRC 檢測
使用 ASCII 模式,消息包括了一基于 LRC 方法的錯誤檢測域。LRC 域檢測了消息域中除開始的冒號及結(jié)束的回車換行號外的內(nèi)容。
LRC 域是一個包含一個 8 位二進制值的字節(jié)。LRC 值由傳輸設(shè)備來計算并放到消息幀中,接收設(shè)備在接收消息的過程中計算 LRC,并將它和接收到消息中 LRC 域中的值比較,如果兩值不等,說明有錯誤。
LRC 方法是將消息中的 8Bit 的字節(jié)連續(xù)累加,丟棄了進位。
LRC 簡單函數(shù)如下:
static unsigned char LRC(auchMsg,usDataLen)
unsigned char *auchMsg ; /* 要進行計算的消息 */
unsigned short usDataLen ; /* LRC 要處理的字節(jié)的數(shù)量*/
{ unsigned char uchLRC = 0 ; /* LRC 字節(jié)初始化 */
while (usDataLen--) /* 傳送消息 */
uchLRC += *auchMsg++ ; /* 累加*/
return ((unsigned char)(-((char_uchLRC))) ;
}
3、CRC 檢測
使用 RTU 模式,消息包括了一基于 CRC 方法的錯誤檢測域。CRC 域檢測了整個消息的內(nèi)容。
CRC 域是兩個字節(jié),包含一 16 位的二進制值。它由傳輸設(shè)備計算后加入到消息中。接收設(shè)備重新計算收到消息的 CRC,并與接收到的 CRC 域中的值比較,如果兩值不同,則有誤。
CRC 是先調(diào)入一值是全“1”的 16 位寄存器,然后調(diào)用一過程將消息中連續(xù)的 8 位字節(jié)各當(dāng)前寄存器中的值進行處理。僅每個字符中的 8Bit 數(shù)據(jù)對 CRC 有效,起始位和停止位以及奇偶校驗位均無效。
CRC 產(chǎn)生過程中,每個 8 位字符都單獨和寄存器內(nèi)容相或(OR),結(jié)果向最低有效位方向移動,最高有效位以 0 填充。LSB 被提取出來檢測,如果 LSB 為 1,寄存器單獨和預(yù)置的值或一下,如果 LSB 為 0,則不進行。整個過程要重復(fù) 8 次。在最后一位(第 8 位)完成后,下一個 8 位字節(jié)又單獨和寄存器的當(dāng)前值相或。最終寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的 CRC 值。
CRC 添加到消息中時,低字節(jié)先加入,然后高字節(jié)。
CRC 簡單函數(shù)如下:
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ; /* 要進行 CRC 校驗的消息 */
unsigned short usDataLen ; /* 消息中字節(jié)數(shù) */
{
unsigned char uchCRCHi = 0xFF ; /* 高 CRC 字節(jié)初始化 */
unsigned char uchCRCLo = 0xFF ; /* 低 CRC 字節(jié)初始化 */
unsigned uIndex ; /* CRC 循環(huán)中的索引 */
while (usDataLen--) /* 傳輸消息緩沖區(qū) */
{
uIndex = uchCRCHi ^ *puchMsgg++ ; /* 計算 CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
/* CRC 高位字節(jié)值表 */
static unsigned char 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,