魏義虎, 陳 雷
(軍械工程學(xué)院 彈藥工程系, 河北 石家莊 050003)
串口通信作為串行通信的一種實(shí)現(xiàn)方式,其歷史可追溯到1969 年。 時(shí)至今日,速度更高的USB、IEEE1394 新型接口已更多的應(yīng)用于串行通信,然而串口接口簡(jiǎn)單、使用方便、可靠性高、適用于低速傳輸,作為為數(shù)不多的以電平為直接信號(hào)載體的計(jì)算機(jī)接口,仍然有廣闊的發(fā)揮作用的空間。
LabVIEW 建立在以圖形數(shù)據(jù)流代替文本式程序代碼進(jìn)行編程的G 語言基礎(chǔ)上[1],編程簡(jiǎn)單、高效。 自帶VISA 函數(shù),可以方便地編寫串口通信程序,但程序的合理編寫以串口原理為基礎(chǔ),需要注意的細(xì)節(jié)較多。 文中在介紹必要的串口通信原理基礎(chǔ)上,對(duì)編寫程序需要注意的問題進(jìn)行了詳細(xì)說明。
串行通信協(xié)議面向鏈路層,分為同步和異步通信協(xié)議兩大類。 串口通信使用起止式異步傳輸協(xié)議。 串行傳輸面向比特,把一次發(fā)送的若干比特稱作一幀。 異步傳輸指發(fā)送方可以在任何時(shí)刻發(fā)送若干幀,接收方不知道數(shù)據(jù)會(huì)在什么時(shí)候到達(dá),幀與幀之間的間隔不固定。 幀的結(jié)構(gòu)按照傳輸?shù)南群箜樞蚍譃槠鹗嘉?、?shù)據(jù)位、奇偶校驗(yàn)位、停止位。 每個(gè)異步傳輸?shù)膸家砸粋€(gè)起始位開頭,它不包含數(shù)據(jù)信息,用來通知接收方數(shù)據(jù)已經(jīng)到達(dá),給接收方響應(yīng)、接收和緩存數(shù)據(jù)的時(shí)間。 一般串口傳送的數(shù)據(jù)是字符型[2],采用ASCII 編碼,數(shù)據(jù)位即字符對(duì)應(yīng)的ASCII 碼值的5-8 位二進(jìn)制數(shù),按照從低位到高位順序傳輸。 奇偶校驗(yàn)位是否采用及采用何種校驗(yàn),由雙方約定。 停止位表示本次數(shù)據(jù)傳輸完畢。 沒有傳送數(shù)據(jù)的線路為邏輯1。起始位為0,線路由1 變?yōu)?。數(shù)據(jù)位隨數(shù)據(jù)信息而變化。 停止位為1, 使線路保持1 直到下一幀起始位到達(dá)。以傳送字符“a”為例,其ASCII 碼值為十進(jìn)制“97”,轉(zhuǎn)換成二 進(jìn) 制 為 “01100001”, 按 照 先 低 位 后 高 位 的 順 序 為“10000110”。 其幀結(jié)構(gòu)如圖1。
圖1 字符a 的幀結(jié)構(gòu)Fig. 1 Frame Structure of character a
發(fā)送方和接收方必須使用相同的傳輸速度, 即比特率,指的是串口通信每一秒所傳輸?shù)臄?shù)據(jù)比特?cái)?shù), 單位是bit/s。如每幀為10 比特, 比特率為9 600 bit/s, 則每秒可以傳送960個(gè)字符。
EIA RS-232 串行通信接口標(biāo)準(zhǔn)面向物理層,完整信號(hào)包含25 根線, 包括UART 傳輸?shù)谋匾盘?hào)和關(guān)于調(diào)制解調(diào)器的控制信號(hào)。 在計(jì)算機(jī)工業(yè)發(fā)展過程中,25 線逐漸簡(jiǎn)化為9線。 其中常用的信號(hào)線為:S-GND 信號(hào)地;TxD(Transmitted Data)、RxD (Received Data) 為 串 口 數(shù) 據(jù) 線;CTS (Clear to send)、RTS(Request to send)為串口控制線。 發(fā)送方的CTS 與接收方的RTS、發(fā)送方的RTS 與接收方的CTS 相連接。 接收方緩沖區(qū)有空間時(shí),將本方RTS 置為有效,此時(shí)發(fā)送方檢測(cè)到自己的CTS 有效,說明接收方希望發(fā)起一次傳輸,于是開始發(fā)送。接收方緩沖區(qū)填滿時(shí),將本方RTS 置為無效,此時(shí)發(fā)送方檢測(cè)到自己的CTS 無效, 說明接收方希望停止傳輸,于是停止發(fā)送。 對(duì)于一般的UART 傳輸, 可以進(jìn)一步簡(jiǎn)化為TxD、RxD、S-GND 三線接法。 需要注意的是發(fā)送方與接收方的S-GND 直接連接,TxD、RxD 交叉連接。
RS-232 以正負(fù)電平表示邏輯值。 在數(shù)據(jù)線上, 邏輯1為-3~-15 V,邏輯0 為+3~+15 V;在控制和狀態(tài)線上,信號(hào)有效為+3~+15 V,信號(hào)無效為-3~-15 V?!溃?-15)V 以外的電平無意義。這與TTL 用高低電平表示邏輯值不同。所以,計(jì)算機(jī)接口與TTL 設(shè)備進(jìn)行串口通信時(shí), 需要進(jìn)行電平和邏輯轉(zhuǎn)換。 目前常用MAX232 進(jìn)行EIA 與TTL 雙向電平轉(zhuǎn)換。
VISA 是測(cè)試程序與數(shù)據(jù)傳輸總線的中間層, 為應(yīng)用程序和儀器總線的通信建立了通道。 VISA 是應(yīng)用于儀器編程的標(biāo)準(zhǔn)I/O 應(yīng)用程序接口,本身不具有儀器編程能力,是調(diào)用低層驅(qū)動(dòng)器的高層API,使用時(shí)需要安裝VISA 驅(qū)動(dòng)程序[3]。
以LabVIEW 2011 為例,VISA 串口編程函數(shù)位于程序框圖界面的“函數(shù)—》儀器I/O—》串口”,常用其中7 個(gè)函數(shù):“VISA 配置串口”用于選擇通信端口、設(shè)置比特率、數(shù)據(jù)位數(shù)、校驗(yàn)方式、流控制等;“VISA 串口字節(jié)數(shù)”用于獲取發(fā)送到接收緩沖區(qū)中的字節(jié)數(shù)量; “VISA 寫入”將傳輸緩沖區(qū)中的數(shù)據(jù)寫入配置串口時(shí)指定的設(shè)備或接口;“VISA 讀取”在指定的串口接收緩沖區(qū)按照指定字節(jié)數(shù)讀取數(shù)據(jù); “VISA 設(shè)置I/O 緩沖區(qū)大小”、“VISA 清空I/O 緩沖區(qū)” 分別用于設(shè)置接收及傳輸緩沖區(qū)的大小或?qū)⑵淝蹇?;“VISA 關(guān)閉” 用于關(guān)閉串口。
通常,按照配置串口、設(shè)置發(fā)送/傳輸緩沖區(qū)、VISA 寫入或VISA 讀取、關(guān)閉串口的流程,再結(jié)合事件、循環(huán)、條件、順序等程序結(jié)構(gòu)和具體數(shù)據(jù)操作處理等即可編寫符合用戶意圖的串口通信程序。 配置串口時(shí),要將發(fā)送方和接收方的比特率、數(shù)據(jù)位數(shù)、奇偶校驗(yàn)等設(shè)置為相同值,即將雙方傳輸速率和幀格式設(shè)置一致。 將“串口字節(jié)數(shù)”輸出連接“串口讀取”的字節(jié)總數(shù)接線端,即按照接收字節(jié)數(shù)量進(jìn)行讀取。
1)數(shù)據(jù)格式與字符串之間的格式轉(zhuǎn)換
一般,串口傳送的是字符串型數(shù)據(jù)。 如需要傳輸?shù)臄?shù)據(jù)不是字符格式, 要使用相應(yīng)轉(zhuǎn)換函數(shù)將數(shù)據(jù)轉(zhuǎn)換為字符格式,否則程序提示“已連接兩個(gè)不同類型的接線端”。 例如,數(shù)值數(shù)據(jù)可以先使用字符串/數(shù)值轉(zhuǎn)換函數(shù)轉(zhuǎn)換為字符串,再進(jìn)行串口發(fā)送。
2)將串口設(shè)置等模塊放置在循環(huán)之外
如果串口通信處于循環(huán)結(jié)構(gòu)中,為減輕內(nèi)存壓力,可以將具體發(fā)送、讀取操作保留在循環(huán)中,而把配置串口、設(shè)置緩沖區(qū)、關(guān)閉串口等操作放置在循環(huán)結(jié)構(gòu)之外,避免頻繁重復(fù)執(zhí)行,以降低內(nèi)存開銷,優(yōu)化程序。
3)丟失數(shù)據(jù)現(xiàn)象
有時(shí)串口接收數(shù)據(jù)不完整或?yàn)榭眨赡苁怯捎诖谑堑讓佑布?,?shù)據(jù)從軟件到串口,及從串口到軟件需要一個(gè)時(shí)間。數(shù)據(jù)還沒有全部傳送到接收緩沖區(qū)時(shí),讀取程序就把部分已接收的數(shù)據(jù)讀出,從而出現(xiàn)接收數(shù)據(jù)不完整的現(xiàn)象。 調(diào)試中,在“VISA 讀取”之前設(shè)置若干ms 的延時(shí),使數(shù)據(jù)傳輸完全,從而讀取完整。 也可能是因?yàn)榻邮站彌_區(qū)被填滿,但讀取程序還沒有處理完數(shù)據(jù),此時(shí)再接收數(shù)據(jù),新的幀就會(huì)丟失。 可以通過設(shè)置流控制使發(fā)送方和接收方進(jìn)行交流協(xié)調(diào)。 在串口線采用三線接法時(shí), 可在配置串口流控制接線端選擇“XON/XOFF”軟件流控制方式。通常使用0x17 作為XON,0x19 作為XOFF,通過數(shù)據(jù)線TxD、RxD 傳輸。 發(fā)送XON,相當(dāng)于置RTS有效;接收XON,相當(dāng)于檢測(cè)到CTS 有效。 發(fā)送XOFF,相當(dāng)于置RTS 無效;接收XOFF,相當(dāng)于檢測(cè)到CTS 無效。 接收方緩沖區(qū)填滿時(shí),向發(fā)送方發(fā)送XOFF,發(fā)送方接收到XOFF,說明接收方希望停止傳輸,于是停止發(fā)送。
光源以平行光束不定時(shí)地照射垂直于水平面的靶板,4個(gè)光電傳感器分布在以靶板中心為圓心的圓周上0°、90°、180°、270°位置,光斑直徑略大于圓直徑,光源距靶板400 m。被照射的傳感器產(chǎn)生光電效應(yīng),經(jīng)調(diào)理輸出高電平,未被照射的傳感器輸出低電平。 4 路傳感器的輸出組成4 位的高低電平序列,被靶端微機(jī)經(jīng)數(shù)據(jù)I/O 卡采集為1D 布爾數(shù)組,等效于范圍從0000 到1111 的二進(jìn)制數(shù),該數(shù)值可反映光斑的大致位置。 將此位置信息從靶端微機(jī)串口發(fā)送,經(jīng)電臺(tái)無線傳輸,光源端微機(jī)自動(dòng)進(jìn)行串口讀取,并將位置信息還原和顯示。
圖2 串口通信應(yīng)用實(shí)例示意圖Fig. 2 Sketch map of the serial port communication application example
串口通信要求數(shù)據(jù)格式為字符串型, 故將1D 布爾數(shù)組轉(zhuǎn)換為數(shù)值, 進(jìn)而由數(shù)值轉(zhuǎn)換為字符串。 由于傳輸距離為400 m,故串口通信采用無線傳輸。 靶端微機(jī)串口與發(fā)送電臺(tái)采用三線接法,TxD、RxD、S-GND 對(duì)應(yīng)連接。光源端微機(jī)串口和接收電臺(tái)也采用三線接法, 但要注意與前者不同,S-GND直接連接,TxD、RxD 交叉連接。 靶端串口發(fā)送程序見圖3。
圖3 靶端串口發(fā)送程序Fig. 3 Serial port transmitting programme of target side
串口通信中設(shè)置“XON/XOFF”及在“串口讀取”前設(shè)置適當(dāng)延時(shí)。 串口讀取后將代表光斑位置的字符串逆向還原為布爾數(shù)組,利用數(shù)組索引各傳感器信號(hào),分別驅(qū)動(dòng)4 個(gè)指示燈。指示燈分布與傳感器空間分布一致。循環(huán)查詢“VISA 串口字節(jié)數(shù)”與0 比較的結(jié)果,大于0 時(shí),自動(dòng)執(zhí)行串口讀取、數(shù)據(jù)處理、控制指示燈指示位置等操作。 光源端串口接收、處理顯示程序見圖4,顯示界面見圖5。
從圖5 可以看到,“右”傳感器被照射時(shí),4 路傳感器輸出等效為二進(jìn)制數(shù) “1000”, 轉(zhuǎn)換為十進(jìn)制 “8”, 串口接收為“0001”,顯示界面“右”指示燈亮。 “左、下”傳感器被照射時(shí),4路傳感器輸出等效為二進(jìn)制數(shù)“0011”,轉(zhuǎn)換為十進(jìn)制“3”,串口接收為“1100”,顯示界面“左、下”指示燈亮。
圖4 光源端串口接收、處理顯示程序Fig. 4 Serial port receiving,handling and displaying programme of light source side
圖5 顯示界面Fig. 5 Displaying interface
在LabVIEW 環(huán)境下,以VISA 串口函數(shù)為主體,結(jié)合事件、循環(huán)、條件等程序結(jié)構(gòu)和各種數(shù)據(jù)操作,再配合信號(hào)線連接及無線傳輸?shù)扔布梢院?jiǎn)便、靈活、高效地編寫串口傳輸程序,實(shí)現(xiàn)串口通信。
[1] 李江全,劉恩博,胡蓉,等. LabVIEW虛擬儀器數(shù)據(jù)采集與串口通信測(cè)控應(yīng)用實(shí)戰(zhàn)[M]. 北京:人民郵電出版社,2010.
[2] Peter W.Gofton. Mastering Serial Communications[M]. 北京:電子工業(yè)出版社,1995.
[3] 呂向鋒,高洪林,等. 基于LabVIEW串口通信的研究[J]. 國(guó)外電子測(cè)量技術(shù),2009,28(12):27-30,42.
[4] 孫麗芹,王海龍,張景順,等. 一種基于LabVIEW的串口數(shù)據(jù)傳輸方法[J]. 通信技術(shù),2013,46(4):139-141.
[5] 劉金梅,王東穎,劉立超,等. 基于LabVIEW串口通信的多路數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)[J]. 北華航天工業(yè)學(xué)院學(xué)報(bào),2012,22(4):16-18.
[6] 施雅婷,郭前崗,周西峰. 一種改進(jìn)的LabVIEW串口通信系統(tǒng)的實(shí)現(xiàn)[J]. 電子測(cè)試,2010(8):64-68.