魏義虎, 陳 雷
(軍械工程學院 彈藥工程系, 河北 石家莊 050003)
串口通信作為串行通信的一種實現方式,其歷史可追溯到1969 年。 時至今日,速度更高的USB、IEEE1394 新型接口已更多的應用于串行通信,然而串口接口簡單、使用方便、可靠性高、適用于低速傳輸,作為為數不多的以電平為直接信號載體的計算機接口,仍然有廣闊的發揮作用的空間。
LabVIEW 建立在以圖形數據流代替文本式程序代碼進行編程的G 語言基礎上[1],編程簡單、高效。 自帶VISA 函數,可以方便地編寫串口通信程序,但程序的合理編寫以串口原理為基礎,需要注意的細節較多。 文中在介紹必要的串口通信原理基礎上,對編寫程序需要注意的問題進行了詳細說明。
串行通信協議面向鏈路層,分為同步和異步通信協議兩大類。 串口通信使用起止式異步傳輸協議。 串行傳輸面向比特,把一次發送的若干比特稱作一幀。 異步傳輸指發送方可以在任何時刻發送若干幀,接收方不知道數據會在什么時候到達,幀與幀之間的間隔不固定。 幀的結構按照傳輸的先后順序分為起始位、數據位、奇偶校驗位、停止位。 每個異步傳輸的幀都以一個起始位開頭,它不包含數據信息,用來通知接收方數據已經到達,給接收方響應、接收和緩存數據的時間。 一般串口傳送的數據是字符型[2],采用ASCII 編碼,數據位即字符對應的ASCII 碼值的5-8 位二進制數,按照從低位到高位順序傳輸。 奇偶校驗位是否采用及采用何種校驗,由雙方約定。 停止位表示本次數據傳輸完畢。 沒有傳送數據的線路為邏輯1。起始位為0,線路由1 變為0。數據位隨數據信息而變化。 停止位為1, 使線路保持1 直到下一幀起始位到達。以傳送字符“a”為例,其ASCII 碼值為十進制“97”,轉換成二 進 制 為 “01100001”, 按 照 先 低 位 后 高 位 的 順 序 為“10000110”。 其幀結構如圖1。

圖1 字符a 的幀結構Fig. 1 Frame Structure of character a
發送方和接收方必須使用相同的傳輸速度, 即比特率,指的是串口通信每一秒所傳輸的數據比特數, 單位是bit/s。如每幀為10 比特, 比特率為9 600 bit/s, 則每秒可以傳送960個字符。
EIA RS-232 串行通信接口標準面向物理層,完整信號包含25 根線, 包括UART 傳輸的必要信號和關于調制解調器的控制信號。 在計算機工業發展過程中,25 線逐漸簡化為9線。 其中常用的信號線為:S-GND 信號地;TxD(Transmitted Data)、RxD (Received Data) 為 串 口 數 據 線;CTS (Clear to send)、RTS(Request to send)為串口控制線。 發送方的CTS 與接收方的RTS、發送方的RTS 與接收方的CTS 相連接。 接收方緩沖區有空間時,將本方RTS 置為有效,此時發送方檢測到自己的CTS 有效,說明接收方希望發起一次傳輸,于是開始發送。接收方緩沖區填滿時,將本方RTS 置為無效,此時發送方檢測到自己的CTS 無效, 說明接收方希望停止傳輸,于是停止發送。 對于一般的UART 傳輸, 可以進一步簡化為TxD、RxD、S-GND 三線接法。 需要注意的是發送方與接收方的S-GND 直接連接,TxD、RxD 交叉連接。
RS-232 以正負電平表示邏輯值。 在數據線上, 邏輯1為-3~-15 V,邏輯0 為+3~+15 V;在控制和狀態線上,信號有效為+3~+15 V,信號無效為-3~-15 V。±(3-15)V 以外的電平無意義。這與TTL 用高低電平表示邏輯值不同。所以,計算機接口與TTL 設備進行串口通信時, 需要進行電平和邏輯轉換。 目前常用MAX232 進行EIA 與TTL 雙向電平轉換。
VISA 是測試程序與數據傳輸總線的中間層, 為應用程序和儀器總線的通信建立了通道。 VISA 是應用于儀器編程的標準I/O 應用程序接口,本身不具有儀器編程能力,是調用低層驅動器的高層API,使用時需要安裝VISA 驅動程序[3]。
以LabVIEW 2011 為例,VISA 串口編程函數位于程序框圖界面的“函數—》儀器I/O—》串口”,常用其中7 個函數:“VISA 配置串口”用于選擇通信端口、設置比特率、數據位數、校驗方式、流控制等;“VISA 串口字節數”用于獲取發送到接收緩沖區中的字節數量; “VISA 寫入”將傳輸緩沖區中的數據寫入配置串口時指定的設備或接口;“VISA 讀取”在指定的串口接收緩沖區按照指定字節數讀取數據; “VISA 設置I/O 緩沖區大小”、“VISA 清空I/O 緩沖區” 分別用于設置接收及傳輸緩沖區的大小或將其清空;“VISA 關閉” 用于關閉串口。
通常,按照配置串口、設置發送/傳輸緩沖區、VISA 寫入或VISA 讀取、關閉串口的流程,再結合事件、循環、條件、順序等程序結構和具體數據操作處理等即可編寫符合用戶意圖的串口通信程序。 配置串口時,要將發送方和接收方的比特率、數據位數、奇偶校驗等設置為相同值,即將雙方傳輸速率和幀格式設置一致。 將“串口字節數”輸出連接“串口讀取”的字節總數接線端,即按照接收字節數量進行讀取。
1)數據格式與字符串之間的格式轉換
一般,串口傳送的是字符串型數據。 如需要傳輸的數據不是字符格式, 要使用相應轉換函數將數據轉換為字符格式,否則程序提示“已連接兩個不同類型的接線端”。 例如,數值數據可以先使用字符串/數值轉換函數轉換為字符串,再進行串口發送。
2)將串口設置等模塊放置在循環之外
如果串口通信處于循環結構中,為減輕內存壓力,可以將具體發送、讀取操作保留在循環中,而把配置串口、設置緩沖區、關閉串口等操作放置在循環結構之外,避免頻繁重復執行,以降低內存開銷,優化程序。
3)丟失數據現象
有時串口接收數據不完整或為空,可能是由于串口是底層硬件,數據從軟件到串口,及從串口到軟件需要一個時間。數據還沒有全部傳送到接收緩沖區時,讀取程序就把部分已接收的數據讀出,從而出現接收數據不完整的現象。 調試中,在“VISA 讀取”之前設置若干ms 的延時,使數據傳輸完全,從而讀取完整。 也可能是因為接收緩沖區被填滿,但讀取程序還沒有處理完數據,此時再接收數據,新的幀就會丟失。 可以通過設置流控制使發送方和接收方進行交流協調。 在串口線采用三線接法時, 可在配置串口流控制接線端選擇“XON/XOFF”軟件流控制方式。通常使用0x17 作為XON,0x19 作為XOFF,通過數據線TxD、RxD 傳輸。 發送XON,相當于置RTS有效;接收XON,相當于檢測到CTS 有效。 發送XOFF,相當于置RTS 無效;接收XOFF,相當于檢測到CTS 無效。 接收方緩沖區填滿時,向發送方發送XOFF,發送方接收到XOFF,說明接收方希望停止傳輸,于是停止發送。
光源以平行光束不定時地照射垂直于水平面的靶板,4個光電傳感器分布在以靶板中心為圓心的圓周上0°、90°、180°、270°位置,光斑直徑略大于圓直徑,光源距靶板400 m。被照射的傳感器產生光電效應,經調理輸出高電平,未被照射的傳感器輸出低電平。 4 路傳感器的輸出組成4 位的高低電平序列,被靶端微機經數據I/O 卡采集為1D 布爾數組,等效于范圍從0000 到1111 的二進制數,該數值可反映光斑的大致位置。 將此位置信息從靶端微機串口發送,經電臺無線傳輸,光源端微機自動進行串口讀取,并將位置信息還原和顯示。

圖2 串口通信應用實例示意圖Fig. 2 Sketch map of the serial port communication application example
串口通信要求數據格式為字符串型, 故將1D 布爾數組轉換為數值, 進而由數值轉換為字符串。 由于傳輸距離為400 m,故串口通信采用無線傳輸。 靶端微機串口與發送電臺采用三線接法,TxD、RxD、S-GND 對應連接。光源端微機串口和接收電臺也采用三線接法, 但要注意與前者不同,S-GND直接連接,TxD、RxD 交叉連接。 靶端串口發送程序見圖3。

圖3 靶端串口發送程序Fig. 3 Serial port transmitting programme of target side
串口通信中設置“XON/XOFF”及在“串口讀取”前設置適當延時。 串口讀取后將代表光斑位置的字符串逆向還原為布爾數組,利用數組索引各傳感器信號,分別驅動4 個指示燈。指示燈分布與傳感器空間分布一致。循環查詢“VISA 串口字節數”與0 比較的結果,大于0 時,自動執行串口讀取、數據處理、控制指示燈指示位置等操作。 光源端串口接收、處理顯示程序見圖4,顯示界面見圖5。
從圖5 可以看到,“右”傳感器被照射時,4 路傳感器輸出等效為二進制數 “1000”, 轉換為十進制 “8”, 串口接收為“0001”,顯示界面“右”指示燈亮。 “左、下”傳感器被照射時,4路傳感器輸出等效為二進制數“0011”,轉換為十進制“3”,串口接收為“1100”,顯示界面“左、下”指示燈亮。

圖4 光源端串口接收、處理顯示程序Fig. 4 Serial port receiving,handling and displaying programme of light source side

圖5 顯示界面Fig. 5 Displaying interface
在LabVIEW 環境下,以VISA 串口函數為主體,結合事件、循環、條件等程序結構和各種數據操作,再配合信號線連接及無線傳輸等硬件,可以簡便、靈活、高效地編寫串口傳輸程序,實現串口通信。
[1] 李江全,劉恩博,胡蓉,等. LabVIEW虛擬儀器數據采集與串口通信測控應用實戰[M]. 北京:人民郵電出版社,2010.
[2] Peter W.Gofton. Mastering Serial Communications[M]. 北京:電子工業出版社,1995.
[3] 呂向鋒,高洪林,等. 基于LabVIEW串口通信的研究[J]. 國外電子測量技術,2009,28(12):27-30,42.
[4] 孫麗芹,王海龍,張景順,等. 一種基于LabVIEW的串口數據傳輸方法[J]. 通信技術,2013,46(4):139-141.
[5] 劉金梅,王東穎,劉立超,等. 基于LabVIEW串口通信的多路數據采集系統設計[J]. 北華航天工業學院學報,2012,22(4):16-18.
[6] 施雅婷,郭前崗,周西峰. 一種改進的LabVIEW串口通信系統的實現[J]. 電子測試,2010(8):64-68.