Modbus RTU模式的協(xié)議字段 Modbus協(xié)議RTU模式要求每一幀的起始和結(jié)束都以至少3.5個(gè)字符為間隔。 每個(gè)字符間隔是字符位數(shù)/波特率,以1位起始位,8位數(shù)據(jù),1位停止位,無奇偶校驗(yàn)位的10位數(shù)據(jù)。 以波特率為9600b/s為例,字符間隔為1.04ms,也就是每一幀的開始和結(jié)束都伴隨著至少3.5*1.04=3.64ms的時(shí)間間隔。 在字節(jié)流中以1.5個(gè)字符時(shí)間作為幀間間隔,以上面的通信速率,則1.5*1.04=1.56ms,即字符流中出現(xiàn)1.56ms的間隔時(shí)可能意味著一幀數(shù)據(jù)結(jié)束。 但必須同時(shí)滿足其后的一段時(shí)間內(nèi)(2個(gè)字符)不會再接收到字符,否則認(rèn)為結(jié)束的該幀為錯(cuò)誤幀。 由于收到的每個(gè)字節(jié)都有可能成為一幀數(shù)據(jù)的最后一個(gè)字節(jié),因此,每接收一個(gè)字節(jié),關(guān)閉上一個(gè)已經(jīng)開啟的3.5個(gè)字符時(shí)間和1.5個(gè)字符時(shí)間的定時(shí)器,處理完接收到得數(shù)據(jù)后再次啟動3.5個(gè)字符時(shí)間和1.5個(gè)字符時(shí)間的定時(shí)器,以檢測該幀數(shù)據(jù)的結(jié)束。 這也就是上面所說的在幀間間隔后的一段時(shí)間內(nèi)(2個(gè)字符)不能接收到數(shù)據(jù),否則該幀為錯(cuò)誤幀。1.5個(gè)字符時(shí)間和3.5個(gè)字符時(shí)間的定時(shí)起點(diǎn)是一致的,這是Modbus協(xié)議RTU模式的關(guān)鍵之處。 當(dāng)然這也增加了系統(tǒng)的中斷負(fù)荷。在發(fā)生1.5個(gè)字符時(shí)間中斷后,處理其接收到得數(shù)據(jù)(這里未考慮設(shè)備地址、超時(shí)、奇偶校驗(yàn)等錯(cuò)誤),計(jì)算接收到的字符數(shù)-2個(gè)字節(jié)的CRC校驗(yàn)和,將計(jì)算結(jié)果與接收到得最后兩個(gè)字節(jié)(當(dāng)做發(fā)送的CRC校驗(yàn))進(jìn)行比較,從而得知這是否是完整的一幀數(shù)據(jù)。CRC校驗(yàn)正確,說明這是一幀完整的數(shù)據(jù),CRC校驗(yàn)錯(cuò)誤,說明這是一幀錯(cuò)誤的數(shù)據(jù)幀,數(shù)據(jù)幀不完整。
|