5.2被動(dòng)接收類型
被動(dòng)接收形的串口通信稍微麻煩一點(diǎn),由于上位機(jī)是被動(dòng)接收的,上位機(jī)不知道什么時(shí)候開 始下位機(jī)就已經(jīng)有數(shù)據(jù)上來了,很有可能下位機(jī)發(fā)送到一半時(shí),上位機(jī)剛好開始接收數(shù)據(jù), 這時(shí)只能接收到后面一半的數(shù)據(jù)了,所以對(duì)于這種通信,一般是采用數(shù)據(jù)幀的方式進(jìn)行通信。
這種數(shù)據(jù)幀的通信方式至少由三部分?jǐn)?shù)據(jù)組成:幀頭、數(shù)據(jù)、幀尾(如果數(shù)據(jù)是固定長度的 話,似乎幀尾也可以省掉)。
幀頭是為了告訴上位機(jī):從這以后的數(shù)據(jù)就是有用的數(shù)據(jù)了,相當(dāng)于約定好的暗號(hào),一般幀 頭至少會(huì)用二個(gè)以上字節(jié),如果只用一個(gè)字節(jié)的話,萬一數(shù)據(jù)中的數(shù)據(jù)跟這個(gè)幀頭一樣了就 會(huì)誤以為這個(gè)數(shù)據(jù)是幀頭從而導(dǎo)致解析數(shù)據(jù)出錯(cuò),幀尾的作用也差不多,告訴上位機(jī)從這之 前的數(shù)據(jù)才是有用的數(shù)據(jù)。但實(shí)際上一般的數(shù)據(jù)幀遠(yuǎn)不止這幾個(gè)部分,還會(huì)加上一些校驗(yàn)字 節(jié)、時(shí)間信息、幀計(jì)數(shù)器之類的東東在上面。
其中校驗(yàn)字節(jié)是為了檢查數(shù)據(jù)在傳輸過程中有沒有出錯(cuò)的,跟串口的校驗(yàn)位要區(qū)分清楚,校 驗(yàn)位也是檢查數(shù)據(jù)傳輸時(shí)有沒有出錯(cuò)的,但由底層硬件來實(shí)現(xiàn),校驗(yàn)方法由標(biāo)準(zhǔn)規(guī)定好,但 有幾種可以選擇,只有一個(gè)位(Bit,只能是0 或 1)。
校驗(yàn)字節(jié)是由軟件層來實(shí)現(xiàn)的,至少有一個(gè)字節(jié)(Byte,有 8 個(gè)位),而且校驗(yàn)方式由用戶 定義,非常靈活。
由于被動(dòng)方式中串口的緩沖區(qū)中一直會(huì)有數(shù)據(jù)在,為了保持?jǐn)?shù)據(jù)的連續(xù)性,在讀取數(shù)據(jù)時(shí) 跟第一種儀器控制類型不一樣。而是采取將讀取的所有的串口數(shù)據(jù)都保存在移位寄存器中, 在軟件上處理完這些數(shù)據(jù)后再將它們從移位寄存器中刪除。
由于 VISA READ 的輸出是字符串,所以一般使用“連接字符串”這個(gè)函數(shù)將它們連接起來, 然后接到循環(huán)結(jié)構(gòu)中的移位寄存器中進(jìn)行保存,當(dāng)移位寄存器中的數(shù)據(jù)量達(dá)到一定時(shí)或滿足 數(shù)據(jù)處理的條件時(shí),才停止這個(gè)循環(huán)輸出讀取到的數(shù)據(jù)。一般如下圖所示:
圖 5 被動(dòng)接收類型中的數(shù)據(jù)接收 在接收下位機(jī)發(fā)送的幀數(shù)據(jù)時(shí),一定要先了解幀格式,這樣才能正確解析出幀里面的數(shù)據(jù)來。 下面以例子來說明數(shù)據(jù)幀格式的通信。
設(shè)定通信數(shù)據(jù)幀每 7 個(gè)字節(jié)為一幀數(shù)據(jù),其中以 0xAC、0x96 二個(gè)字節(jié)作為數(shù)據(jù)幀頭,第三、 四個(gè)幀頭為幀計(jì)數(shù)器,最大值為 0xFFFF,到達(dá)最大值后重新從 0 開始計(jì)數(shù),第 4、5、6 三 個(gè)字節(jié)是數(shù)據(jù)信息,分別代表數(shù)據(jù)的高中低位,第 7 位為狀態(tài)標(biāo)志字節(jié),它的第一位為 1 時(shí)表示下位機(jī)出錯(cuò),為 0 時(shí)表示功能正常。
由于 LabVIEW 中接收到的數(shù)據(jù)都是以字符串的形式顯示出來的,所以需要將字符串轉(zhuǎn)換為
ASCII 碼,一般可以直接使用“轉(zhuǎn)換為 U8 數(shù)組”這個(gè)函數(shù),如下圖所示: