串行通信中滑動(dòng)窗過(guò)濾器的多協(xié)議自動(dòng)識(shí)別
在室內(nèi)型和室外型云臺(tái)及一體化智能高速球型攝像機(jī)中,解碼器通過(guò)rs-485總線接收來(lái)自監(jiān)控中心由控制鍵盤(pán)或dvr發(fā)送的命令,對(duì)命令進(jìn)行解析后發(fā)出相應(yīng)的控制指令,從而控制云臺(tái)的上下左右運(yùn)動(dòng)以及攝像機(jī)的光圈、聚焦和變倍等調(diào)整動(dòng)作。
1 通信協(xié)議介紹
一個(gè)控制命令就是一個(gè)通過(guò)串行總線傳輸?shù)南?,消息由多個(gè)字節(jié)組成,每個(gè)字節(jié)的傳輸格式一般都是1個(gè)起始位、8個(gè)數(shù)據(jù)位、1個(gè)停止位、沒(méi)有奇偶校驗(yàn)位。下面介紹消息的基本結(jié)構(gòu),第一個(gè)字節(jié)往往是同步字節(jié)或稱特征字節(jié),可以是aah或55h等,它的作為是讓總線上的每個(gè)終端作好接收后續(xù)字節(jié)的準(zhǔn)備。第二個(gè)字節(jié)是地址,即指明接收該命令的終端地址,響應(yīng)該消息的可能是一個(gè),也可能是一組或全部的終端。每個(gè)終端有自己獨(dú)一無(wú)二的地址信息,只有當(dāng)接收到的信息中的地址與自己的地址吻合時(shí),才執(zhí)行該命令,因?yàn)榈刂纷止?jié)只有8位,因此同一系統(tǒng)中最多只能識(shí)別256個(gè)不同的終端。在串行通信中,除了單個(gè)字節(jié)的傳輸有時(shí)需要奇偶校驗(yàn)外,接收到的消息還要做整體的數(shù)據(jù)塊校驗(yàn),通常采取的是將數(shù)據(jù)塊進(jìn)行簡(jiǎn)單的累加或者是異或后得到一個(gè)校驗(yàn)字節(jié)(check-byte),將該校驗(yàn)字節(jié)附加在消息的最后發(fā)出。終端接收后,首先要對(duì)接收到的數(shù)據(jù)塊進(jìn)行校驗(yàn)以判斷數(shù)據(jù)是否可靠。表1是pelco-d協(xié)議的一個(gè)完整消息的結(jié)構(gòu)。
不同的公司采用不同的協(xié)議,消息的結(jié)構(gòu)完全不同。表2顯示4種常見(jiàn)傳輸協(xié)議的基本格式。
由于協(xié)議之間完全不兼容,因此云臺(tái)解碼器往往只使用其中一種傳輸協(xié)議,造成產(chǎn)品的適用范圍不廣,一種兼容多種協(xié)議的解決方法是采用硬件設(shè)定的方法,即在解碼器上設(shè)計(jì)一個(gè)多位撥碼開(kāi)關(guān),當(dāng)使用不同協(xié)議時(shí),撥碼開(kāi)關(guān)的選擇狀態(tài)不同,單片機(jī)讀取該設(shè)定參數(shù)后就知道當(dāng)前是什么樣的傳輸協(xié)議,然后采取相應(yīng)的解碼措施,在串行口中,當(dāng)接收到對(duì)應(yīng)協(xié)議中每個(gè)消息的特征字節(jié)時(shí),就開(kāi)始接收相應(yīng)長(zhǎng)度的后續(xù)字節(jié),否則放棄該字節(jié)不予判斷,這樣設(shè)計(jì)的缺陷在于,首先必須非常明確當(dāng)前的傳輸協(xié)議,其次是當(dāng)更換不同的協(xié)議時(shí)必須重新設(shè)定拔碼開(kāi)關(guān)的狀態(tài),在使用過(guò)程中不靈活不方便,而且這種方法容易造成誤判,因?yàn)橐环N協(xié)議中的特征字節(jié)也很可能會(huì)在其他協(xié)議的命令中以非特征字節(jié)的形式出現(xiàn)。僅僅依靠特征字節(jié)來(lái)決定是否接收后續(xù)字節(jié)是很容易丟碼或產(chǎn)生誤碼的。
2 滑動(dòng)窗和過(guò)濾器
本文提出采用滑動(dòng)窗過(guò)濾器的方式進(jìn)行多協(xié)議的自動(dòng)識(shí)別,而不會(huì)造成誤碼或漏碼。在單片機(jī)的ram中建立一個(gè)數(shù)組r_buf[n],他是對(duì)串口數(shù)據(jù)流進(jìn)行過(guò)濾的窗口,窗體的大小即數(shù)組的大小n,取各種協(xié)議中的一個(gè)消息所包含的字節(jié)最多的長(zhǎng)度,例如取samsung協(xié)議的長(zhǎng)度為9。串口接收到的任何一個(gè)字節(jié)都按照先入先出的順序通過(guò)該窗口,而不論該字節(jié)是否是特征字節(jié),串口接收的數(shù)據(jù)碼流依次流經(jīng)該數(shù)組,因此該數(shù)組像一個(gè)窗口。始終保留碼流中的最后一幅數(shù)據(jù)的圖像,如圖1所示。
各種協(xié)議以其不同的特征字節(jié)、消息長(zhǎng)度和校驗(yàn)字節(jié)的規(guī)律而構(gòu)成過(guò)濾器。每從串口中接收到一個(gè)新的字節(jié),滑動(dòng)窗的內(nèi)容就刷新一次,同時(shí)將窗口內(nèi)容與過(guò)濾器中的數(shù)據(jù)結(jié)構(gòu)對(duì)比一次,這樣做得好處在于,接收到的串行數(shù)據(jù),無(wú)論其是什么協(xié)議,什么長(zhǎng)度以及什么特征字節(jié),都會(huì)被過(guò)濾一次,滑動(dòng)窗在數(shù)據(jù)碼流中從頭往后搜索,不放過(guò)任何一個(gè)符合某個(gè)協(xié)議的有效消息。只要落入滑動(dòng)窗口內(nèi)的那些數(shù)據(jù)符合任何一種協(xié)議的數(shù)據(jù)格式,該數(shù)據(jù)就被認(rèn)為是一個(gè)有效的消息,因此不會(huì)產(chǎn)生漏碼或誤碼的現(xiàn)象。
3 軟件設(shè)計(jì)
過(guò)濾過(guò)程包括3個(gè)階段:第一個(gè)階段是特征字節(jié)過(guò)濾;第二個(gè)階段是校驗(yàn)字節(jié)過(guò)濾;第三個(gè)階段是地址過(guò)濾,即判斷消息的目的地址與該解碼器設(shè)備的地址是否吻合。只有在這三個(gè)階段的過(guò)濾過(guò)程中均符合要求的消息才是有效命令,然后才開(kāi)始對(duì)命令進(jìn)行解析和執(zhí)行,因?yàn)槭亲詣?dòng)識(shí)別,因此r_buf[0]中內(nèi)容每刷新一次就必須開(kāi)始一次過(guò)濾過(guò)程。
下面以8051系列兼容單片機(jī)為例,用keil c51語(yǔ)言來(lái)描述窗體的形成以及過(guò)濾方法。整個(gè)過(guò)程都是在串口中斷服務(wù)程序中完成的。
4 結(jié)論
采用滑動(dòng)窗和過(guò)濾器的方式可以自動(dòng)識(shí)別不同的傳輸而無(wú)需通過(guò)硬件的方式進(jìn)行協(xié)議設(shè)定,采用該方法編程簡(jiǎn)單方便,對(duì)碼流的識(shí)別速度快、效率高、實(shí)際應(yīng)用表明沒(méi)有漏碼和誤碼現(xiàn)象發(fā)生,但是這種方法也有缺陷:一是只能識(shí)別那些每個(gè)消息的字節(jié)數(shù)確定的協(xié)議,而對(duì)那些消息長(zhǎng)度不確定的協(xié)議不適合,因?yàn)榛瑒?dòng)窗的大小是固定的,而過(guò)濾器的大小無(wú)法確定;二是需要自動(dòng)識(shí)別協(xié)議的傳輸波特率都必須相同,否則無(wú)法正確識(shí)別,這是因?yàn)橄⒌膬?nèi)容是可以自動(dòng)識(shí)別的,而波特率卻不是。
評(píng)論