Labview 串口通信之——PC控制云台方向
一、項目需求:
1.??????完成上位機與下位機的串口通信
2.??????上位機電腦給下位機發送16進制指令,控制攝像機云臺的各個方向。
3.??????該程序用Labview開發
?
二、開發過程:
1.??????開發平臺搭建:
開發過程用到的幾個軟件介紹:
(1)??????串口調試助手
(2)??????VPSD XP5(虛擬串口軟件)
(3)??????Labview
(4)??????Sony云臺自帶軟件(類似于串口調試助手)
?
2.??????各個軟件介紹:
3.???打開VSPD,界面如下圖所示:
左邊欄最上面的是電腦自帶的物理串口。點右邊的addpair,可以添加成對的串口。一對串口已經虛擬互聯了,如果添加的是COM3、COM4,用COM3發送數據,COM4就可以接收數據,反過來也可以。
4.串口調試助手
可以看到虛擬出來的串口COM3、COM4,選擇COM4,設置為波特率9600,無校驗位、8位數據位,1位停止位。
?
5. RS232
RS-232接口符合美國電子工業聯盟(EIA)制定的串行數據通信的接口標準,原始編號全稱是EIA-RS-232(簡稱232,RS232)。它被廣泛用于計算機串行接口外設連接。連接電纜和機械、電氣特性、信號功能及傳送過程。
6.同步傳輸和異步傳輸
?
同步傳輸通常要比異步傳輸快速得多。接收方不必對每個字符進行開始和停止的操作。一旦檢測到幀同步字符,它就在接下來的數據到達時接收它們。
?
7.同步異步傳輸的區別
1)異步傳輸是面向字符的傳輸,而同步傳輸是面向比特的傳輸。
?
2,)異步傳輸的單位是字符而同步傳輸的單位是楨。
?
3,)異步傳輸通過字符起止的開始和停止碼抓住再同步的機會,而同步傳輸則是以數據中抽取同步信息。
?
4,)異步傳輸對時序的要求較低,同步傳輸往往通過特定的時鐘線路協調時序。
?
5,)異步傳輸相對于同步傳輸效率較低。
三.近距離通信,RS232
3.1簡單連接:
當通信距離較近時,可不需要Modem,通信雙方可以直接連接,這種情況下,只需使用少數幾根信號線。最簡單的情況,在通信中根本不需要RS-232C的控制聯絡信號,只需三根線(發送線、接收線、信號地線)便可實現全雙工異步串行通信,即是這里要討論的第一種情況。
無Modem時,最大通信距離按如下方式計算:
RS-232C標準規定:當誤碼率小于4%時,要求導線的電容值應小于2500PF。對于普通導線,其電容值約為170PF/M。則允許距離L=2500PF/(170PF/M)=15M
這一距離的計算,是偏于保守的,實際應用中,當使用9600bps,普通雙絞屏蔽線時,距離可達30~35米。
3.2、零Modem 的最簡連線(3線制)
圖3是零MODEM方式的最簡單連接(即三線連接),圖中的2號線與3號線交叉連接是因為在直連方式時,把通信雙方都當作數據終端設備看待,雙方都可發也可收。在這種方式下,通信雙方的任何一方,只要請求發送RTS有效和數據終端準備好DTR有效就能開始發送和接收。
?
(1)RTS與CTS互聯:只要請求發送,立即得到允許
(2)DTR與DSR互聯:只要本端準備好,認為本端立即可以接收(DSR、數傳機準備好)。
?
3.3 串口問題匯總:
3.31串口資源被占用:
這時候在LabVIEW會報錯,提示串口號存在,但當前不能對其進行操作,同時打開MAX時也可以在對應的串口號下看到同樣的錯誤,這表示這個串口已經被其它程序占用了,比如有時候打開了串口調試助手來調試串口,然后又想在LabVIEW里面試一下,這時就會報這個錯,因為串口已經被串口調試助手調用了,它不能被二個程序同時使用。
解決的方法是關掉其它程序即可,串口調試助手里也可以關閉這個串口。
還有一種情況是調試OK后生成EXE,運行EXE也出現這個問題,這時是因為串口被原來的LabVIEW程序打開,再用EXE打開時就會報錯,解決辦法是關掉原來的LabVIEW程序。最好是關掉LabVIEW.
在使用串口的過程中一定要關閉串口(使用VISA CLOSE),否則程序在退出的時候會報錯說數據丟失。
?
四.關鍵數據格式轉換問題
?
4.1使用LabVIEW發送數據
?
還有一個問題是使用LabVIEW發送數據的問題
①如果下位機接收的是字符串數據類型的話,直接用VISA寫入對應的字符串就行了,現在的儀器一般都是接收字符串的,所以可以直接使用VISA發送而不需要轉換。
②如果下位機接收的是數值型數據的話,就需要轉換一下,其中數值型又是十進制和十六進制二種用得比較多,這二種數據間相互轉換一下就行了,其實是一樣的。
由于在LabVIEW中字符串直接有十六進制的顯示方式,所以發送十六進制的數據比較方便,比如要發送十六進制數值類型的“0xAF”,那么在VISA Write的寫入緩沖區字符串常量上右鍵>>十六進制顯示,如圖1,直接輸入“AF”即可,那么下位機接收到的就是正確的數據(十六進制數值類型)了。
但實際使用過程中,一般都是需要將某個子VI輸出一個動態的字符串通過VISAWrite發送到下位機的,這時候就需要對數據進行轉換一下,這個轉換過程描述起來就是:將字符串A轉換為字符串B,使得正常顯示的字符串A跟十六進制顯示的字符串B是一樣的。
由于轉換目標(十六進制顯示的字符串)的數據類型是十六進制,要想十六進制顯示的字符串跟正常顯示的字符串一樣,這個正常顯示的字符串必須都是十六進制的字符,即只能由0-9,A-F這十六個字母中的字母組合而成。否則就沒辦法使二種顯示方式的字符串一致了。
這個轉換過程首先將字符串轉換為十六進制數值型,然后再通過將這個十六進制數值創建為一個數組,最后再使用“字節數組至字符串轉換”這個函數轉換為字符串即可,實際上就是圖5字符串轉換為U8字節的反向操作,只不過是這個十六進制的值初始類型是十六進制,要先轉換為數值類型。具體程序如下圖所示。
由于十六進制數據由二個字節構成,而字符只有一個字符,所以每二個字符表示一個十六進制數據,如果字符多于二個的話要先進行截取,每二個字符轉換為一個十六進制數據。也可以用空格將正常顯示的字符串每二個字符用一個空格斷開,然后先將這個字符串以空格為分隔符轉換為一個字符串數組,再轉換為十六進制數值再轉換為字符串。
需要注意一下的是如果正常顯示的字符串并不是2的整數倍,那么上圖的轉換程序就會少轉換一個字符,可以用程序動態判斷一下這個字符串的長度,如果是奇數的話在它最左邊補一個“0”再使用上面的程序就正常了。
?
4.2 LabVIEW從串口接收數據
?
①假設LabVIEW從串口接收到的數據為“1234”(正常顯示模式下),那么這個數據在串口底層的時候其實是這樣的二進制數據:
0011000100110010 00110011 00110100
只是在LabVIEW中,這些二進制數據是以字符串形式顯示出來的,它們的實質還是二進制數據,這幾個二進制數據轉換為十進制數據分別是“49,50,51,52”,由于字符串都是以ASCII碼形式保存在計算機中的,那么49,50,51,52這幾個數在ASCII表中就表示是字符串“1,2,3,4”。所以這幾個數據在LabVIEW中就顯示為字符串的1,2,3,4了。如果明白這里面的轉換關系,那么要進行數據轉換時就很容易了,比如上面的例子中,如果LabVIEW中接收到的是字符串“1234”,而原本下位機傳送的是數值型數據,只需要將“1234”字符串轉換為對應的ASCII值就是實際上下位機傳上來的數據了,就是“49,50,51, LabVIEW中將字符串轉換為對應的ASCII值的函數是“字符串至字節數組轉換”這個函數。
上面說的是下位機發送的是數值類型的數據的,使用“字符串至字節數組轉換”這個函數. ②如果是下位面發送的是字符串類型的數據,那么LabVIEW已經直接轉換好了。
個人總結:無論下位機發送的是何種類型的數據,LABVIE從串口接收的時候,總是將每8位二進制數,作為字符的ASCII碼解讀。
?
4.3 關鍵問題解決:
?
???????? 貼了那么多資料,最終還是要回歸到具體解決的問題上來。本次做的小項目,總體來說,開發周期比較短,程序功能比較簡單,但是涉及到的知識面比較多,知識點多而雜亂,所以對這部分資料做了相關整理,權當對思路的整理。
???????? 本次遇到的問題:
????PC與攝像機云臺通信過程中,開發的程序第一版可以完成虛擬串口之間的數據通信,但是問題是實際測試中還是不能控制云臺。檢測了相關指令也沒發現錯誤。
???????? 后來發現Labview程序無論是接收還是發送數據都是以字符串格式完成的,所以當客戶要求用16進制完成下位機與上位機通信的時候,問題就出現了。最開始設計程序的時候也沒考慮到這個問題。
?
(1)????將16進制轉化成asc碼:
這個方法行不通,數據發下去還是不行。繼續找資料,找到下面的解決方案:
(2)????在Labview軟件中設置字符串的顯示格式
Labview軟件中設置字符串的顯示格式為:16進制顯示(也就是:Hex display);
具體做法參考以下鏈接:
?
http://blog.csdn.net/liusandian/article/details/51912000
?
總結
以上是生活随笔為你收集整理的Labview 串口通信之——PC控制云台方向的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: labview如何进行串口通讯(转)
- 下一篇: 工作2年后悟出的道理