點擊學(xué)習(xí)>>《龍哥手把手教你學(xué)LabVIEW視覺設(shè)計》視頻教程
一、LabviewRS232串口通信數(shù)據(jù)格式問題解析
1)最近在開發(fā)一款Labview串口通信軟件,功能是實現(xiàn)PC與sony攝像機云臺的數(shù)據(jù)通信。主要是通過PC發(fā)送16進制指令控制云臺的轉(zhuǎn)動,方便做一些測試。
遇到的問題:一開始沒注意格式問題,只是純粹的將16進制數(shù)據(jù)放入VISAWRITE函數(shù)的寫入緩沖區(qū)。但是忽略了一個問題,就是Labview軟件中的程序無論是接收還是發(fā)送數(shù)據(jù)都是字符串的格式,所以遇到其他格式通信的時候需要做相關(guān)轉(zhuǎn)換操作
如果這些數(shù)據(jù)是靜態(tài)的,也就說在程序設(shè)計階段要傳輸?shù)臄?shù)據(jù)就已經(jīng)確定了,在這種情況下,首先設(shè)置VISAWrite的writebuffer的顯示屬性為HexDisplay,然后直接輸入要發(fā)送的16進制字符串就可以了。串口設(shè)備的控制命令通常是由一個或多個16進制字符組成的,當(dāng)我們需要對其進行控制時經(jīng)常會采用這種方法發(fā)送控制命令。
2)使用LabVIEW發(fā)送數(shù)據(jù)
還有一個問題是使用LabVIEW發(fā)送數(shù)據(jù)的問題
①如果下位機接收的是字符串?dāng)?shù)據(jù)類型的話,直接用VISA寫入對應(yīng)的字符串就行了,現(xiàn)在的儀器一般都是接收字符串的,所以可以直接使用VISA發(fā)送而不需要轉(zhuǎn)換。
②如果下位機接收的是數(shù)值型數(shù)據(jù)的話,就需要轉(zhuǎn)換一下,其中數(shù)值型又是十進制和十六進制二種用得比較多,這二種數(shù)據(jù)間相互轉(zhuǎn)換一下就行了,其實是一樣的。
由于在LabVIEW中字符串直接有十六進制的顯示方式,所以發(fā)送十六進制的數(shù)據(jù)比較方便,比如要發(fā)送十六進制數(shù)值類型的“0xAF”,那么在VISAWrite的寫入緩沖區(qū)字符串常量上右鍵》》十六進制顯示,直接輸入“AF”即可,那么下位機接收到的就是正確的數(shù)據(jù)(十六進制數(shù)值類型)了。
二、在LabVIEW中使用串口
1、串口VI介紹
LabVIEW的串口通訊VI位于InstrumentI/OPlatte的Serial中,包括:

2、使用說明
在LabVIEW環(huán)境中使用串口與在其它開發(fā)環(huán)境中開發(fā)過程類似,基本的流程框圖如下。

圖1、串口操作數(shù)據(jù)流圖
首先需要調(diào)用VISAConfigureSerialPort完成串口參數(shù)的設(shè)置,包括串口資源分配、波特率、數(shù)據(jù)位、停止位、校驗位和流控等等。

圖2、初始化串口
如果初始化沒有問題,就可以使用這個串口進行數(shù)據(jù)收發(fā)。發(fā)送數(shù)據(jù)使用VISAWrite,接收數(shù)據(jù)使用VISARead。在接收數(shù)據(jù)之前需要使用VISABytesatSerialPort查詢當(dāng)前串口接收緩沖區(qū)中的數(shù)據(jù)字節(jié)數(shù),如果VISARead要讀取的字節(jié)數(shù)大于緩沖區(qū)中的數(shù)據(jù)字節(jié)數(shù),VISARead操作將一直等待,直至Timeout或者緩沖區(qū)中的數(shù)據(jù)字節(jié)數(shù)達到要求的字節(jié)數(shù)。當(dāng)然也可以分批讀取接收緩沖區(qū)或者只從中讀取一定字節(jié)的數(shù)據(jù)。

圖3、從串口發(fā)送數(shù)據(jù)

圖4、從串口接收數(shù)據(jù)
在某些特殊情況下,需要設(shè)置串口接收/發(fā)送緩沖區(qū)的大小,此時可以使用VISASetI/OBufferSize;而使用VISAFlushI/OBuffer則可以清空接收與發(fā)送緩沖區(qū)。在串口使用結(jié)束后,使用VISAClose結(jié)束與VISAresourcename指定的串口之間的會話。

三、注意事項
1、串口通訊的波特率設(shè)置要精確,比如要求9600的波特率,則晶振應(yīng)選擇11.0593MHz或其倍數(shù)。
2、由于通常情況下LabVIEW串口VI接收或發(fā)送的都是字符串(Normal),所以如果需要發(fā)送或接收十六進制數(shù)值(Hex),請在發(fā)送或接收之前進行必要的轉(zhuǎn)換。
2.1、數(shù)值型數(shù)據(jù)的處理方法:
如果這些數(shù)據(jù)是靜態(tài)的,也就說在程序設(shè)計階段要傳輸?shù)臄?shù)據(jù)就已經(jīng)確定了,在這種情況下,首先設(shè)置VISAWrite的writebuffer的顯示屬性為HexDisplay,然后直接輸入要發(fā)送的16進制字符串就可以了。串口設(shè)備的控制命令通常是由一個或多個16進制字符組成的,當(dāng)我們需要對其進行控制時經(jīng)常會采用這種方法發(fā)送控制命令。
數(shù)據(jù)是動態(tài)的;即要傳輸?shù)臄?shù)值型數(shù)據(jù)是動態(tài)產(chǎn)生和變化的,在發(fā)送之前首先要將其轉(zhuǎn)換成對應(yīng)的16進制字符串,才能賦給VISAWrite發(fā)送。將這些數(shù)據(jù)構(gòu)成一個數(shù)組,用ByteArrayToString進行轉(zhuǎn)換,轉(zhuǎn)換的結(jié)果就是對應(yīng)數(shù)組數(shù)值的字符串,可以提交VISAWrite發(fā)送?;蛘呤褂肨ypeCast也可以實現(xiàn)同樣的功能。

圖13、串口數(shù)據(jù)轉(zhuǎn)換界面

圖14、串口數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)流圖

圖15、操作界面

圖16、單片機C程序
2.2、字符串型數(shù)據(jù)的處理方法:
我們在處理過程當(dāng)中,傳輸?shù)臄?shù)據(jù)可能具有一定格式或協(xié)議,比如一個完整的數(shù)據(jù)幀包括起始段、數(shù)據(jù)段、校驗段等等,而每一段往往又有幾個部分組成,這幾個部分的類型和長度可能又不盡相同,可能是數(shù)值型的,可能是字符型的,也可能是布爾型的,單字節(jié)或者是多字節(jié)。此時我們往往都采用統(tǒng)一的字符形式來處理這些數(shù)據(jù),因此有時候我們說,字符是LabVIEW里最方便的數(shù)據(jù)類型。
經(jīng)過打包的字符數(shù)據(jù)要經(jīng)過串口發(fā)送需要進行必要的轉(zhuǎn)換,否則傳輸將出錯。比如我們打包過后需要發(fā)送的的字符串為:3412567894(空格為了區(qū)分),如果直接將其賦給VISAWrite發(fā)送,串口上的數(shù)據(jù)將是:33343132353637383934。正確的轉(zhuǎn)換程序如下。

圖17、字符型數(shù)據(jù)處理
四、Labview與RS232串口通信
選擇串行資源并配置參數(shù)(波特率、數(shù)據(jù)位、奇偶、停止位),根據(jù)自己電腦的串口選擇串口號,這里選擇COM10,波特率默認9600,其他全部默認即可

讀取串口的數(shù)據(jù),這里只需要考慮輸入輸出即可,輸入為串口資源,輸出為字符串

向串口寫數(shù)據(jù),跟讀取串口類似,這里設(shè)置寫入內(nèi)容為Hello

關(guān)閉串口,每個流程都必須要關(guān)閉串口

總的程序框圖如下。

這是和串口助手一起調(diào)試的效果圖

電子發(fā)燒友App











評論