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