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