久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10766|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

LabVIEW串口通信教程

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:315961 發(fā)表于 2018-4-25 09:55 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
LabVIEW串口通信教程,見附件,收集于網(wǎng)絡(luò),給需要參考的朋友

串口可以說是我們最容易見到,也最容易接觸到的一種總線,臺(tái)式機(jī)上一般都有 二個(gè),而現(xiàn)在很多下位機(jī)、儀器等很多都還是使用串口通信的。論壇上很多朋友
都經(jīng)常會(huì)使用到串口,并遇到一些問題,這里有必要做一個(gè)詳細(xì)的說明,以方便 廣大會(huì)員朋友方便使用。

首先補(bǔ)充一個(gè)比較重要的問題,就是在 LabVIEW 中使用串口的話一定要先安裝 VISA 這個(gè)驅(qū)動(dòng),然后生成的 EXE 運(yùn)行時(shí)也需要在目標(biāo)機(jī)上安裝 VISA Runtime Engine,可以在打包時(shí)一起打包。


1.串口擴(kuò)展的問題:

先說一下串口的擴(kuò)展問題,一般的臺(tái)式機(jī)或工控機(jī)上都至少有二個(gè)串口,一般都 是夠用的,但是現(xiàn)在市場(chǎng)上已經(jīng)很難找到帶串口的筆記本了,而有時(shí)候在外出調(diào) 試時(shí)需要在筆記本中使用到串口的,這時(shí)一般是使用 USB-RS232 的轉(zhuǎn)接線,價(jià) 格從十幾到一百多都有,很多朋友反應(yīng)在使用價(jià)格低的轉(zhuǎn)接線時(shí)會(huì)出現(xiàn)亂七八糟 的問題,而貴一點(diǎn)的線就很少聽說有其它問題的,所以大家在使用便宜的 USB-RS232 轉(zhuǎn)接線時(shí)要特別注意線的質(zhì)量,遇到一些奇怪的問題時(shí)先考慮換一 根好一點(diǎn)的線。PCI-RS232 擴(kuò)展卡也同理,便宜的卡也容易出問題,盡量買好一 點(diǎn)的,以免因小失大。PCI-RS232 一般至少能擴(kuò)展 2 個(gè)串口,有些 BT 一點(diǎn)的可 以擴(kuò)展到 8-16 個(gè),一堆線和接頭。轉(zhuǎn)接線和擴(kuò)展卡一般是要裝驅(qū)動(dòng)的。



2.串口功能的確認(rèn):


在使用串口之前,最好先確認(rèn)一下串口是否正常,特別是使用轉(zhuǎn)換接或擴(kuò)展卡的。 檢查的方法很簡(jiǎn)單,就是將串口的 2、3 腳短接起來,3腳是發(fā)送數(shù)據(jù),2 腳接收 數(shù)據(jù),就是這個(gè)串口自發(fā)自收。電腦上的串口軟件一般是用串口調(diào)試助手,很出 名的,也好用。如下圖所示:




圖 1 串口調(diào)試助手

打開軟件,選擇已經(jīng)短接好的串口號(hào),點(diǎn)擊“手動(dòng)發(fā)送”,如果串口是好的,2、3 腳又短接起來了,馬上就可以在上面的接收框里看到接收的數(shù)據(jù)就是發(fā)送的數(shù) 據(jù)。稍微要注意一下的是有些電腦的 COM1 和 COM2 的位置是反過來的,所以 要確定好串口調(diào)試助手左上角的串口上擇的是已經(jīng)短接的那一個(gè),如果 COM1 沒接收到,可以再先 COM2 再發(fā)一次看一下。




3
.串口線的檢查:


檢查好串口后,一般也要注意一下使用的串口線,標(biāo)準(zhǔn)的串口線是 9根線都是用 上的,但有一些是只使用了三根線的:2、3、5。第 3 個(gè)腳管是發(fā)送,第 2 個(gè)管 腳接收,另一個(gè) 5 是地線,這里叫它簡(jiǎn)化的串口線,簡(jiǎn)化的串口線能用上的地方, 標(biāo)準(zhǔn)的串口線也肯定能用上,因?yàn)闃?biāo)準(zhǔn)線的 9 根線已經(jīng)包括了簡(jiǎn)化串口線中的 3 根線,但標(biāo)準(zhǔn)串口線能用上的地方,簡(jiǎn)化串口線就不一定能用上,所以在使用串 口線之間一定要確定好串口線的類型,一般買的串口線都是標(biāo)準(zhǔn)線,但自制的串 口線因?yàn)閼?yīng)用場(chǎng)合不同就要先確定一下。


G 串口線還有一個(gè)地方需要注意一下的,就是 2、3 腳的接法,標(biāo)準(zhǔn)接法中是 2、
3 腳交叉的,即這邊的 2 接另一邊的 3,這邊的 3 接另一邊的 2,扭了一下,所以叫交叉線,因?yàn)檎J褂脮r(shí),這邊第二腳是發(fā)送數(shù)據(jù),另一邊第三腳是接收數(shù) 據(jù),所以要將這二個(gè)管腳連接起來,這樣才能正常使用。但是有些情況下,2、3 是直連的,即這邊的第 2 腳連接另一邊的第 2 腳,第 3 腳連接第 3 腳,這種叫直 連線,這種線一般是用于延長串口的,比如需要將工控機(jī)的串口接頭引到機(jī)柜表


面上時(shí),就使用這種線,這樣機(jī)柜表面的串口線的定義還是跟電腦接出來的一樣, 外面的那一根串口線再使用交叉線。從電腦主板上將串口引到主機(jī)后面板上的線 就是這樣的直連線。購買串口線的時(shí)候一般也會(huì)問你買直連的還是交叉的,要區(qū) 別對(duì)待。


串口線還有一個(gè)要稍微注意一下的就是 DB 頭,因?yàn)殡娔X上接出來的一般是公頭
(針),要跟電腦接的話要母頭(孔),一般儀器的串口也是公頭,所以二邊都 是母頭的串口線比較常見。串口的接頭一般是 DB9的,也有 DB25 的,但比較 少用,有些比較 BT 的儀器廠家居然用 RJ11(水晶頭那種)作為串口頭,讓人不 爽!

總之,使用串口前一定要先確定好硬件沒問題,不然很浪費(fèi)時(shí)間的。



4.串口參數(shù)設(shè)置:




在 LabVIEW 中使用串口時(shí),有幾個(gè)參數(shù)比較重要,需要先說明一下的。一個(gè)是 串口初始化這個(gè)節(jié)點(diǎn)的“終止符”和“禁用終止符?”這二個(gè)輸入端,這二個(gè)輸入端 是相互作用的,“終止符”默認(rèn)值為 10,它的十六進(jìn)制是“0x0A”,這是一個(gè) ASCII 碼,是一個(gè)換行符,可以從LabVIEW 中的字符串的不同顯示形式看出來,如下圖:

圖 2 串口消息終止符 左邊是字符串的正常顯示,中間是十六進(jìn)制顯示,右邊是“\代碼顯示”,這三個(gè)
字符串的值都是一樣的。終止符是 10,表示在接收數(shù)據(jù)時(shí),遇到 ASCII 碼為 10
的字符(即換行符)時(shí)就停止接收數(shù)據(jù),后面會(huì)有例子進(jìn)行說明。


而“禁用終止符?”的默認(rèn)值是 FALSE,即啟用終止符,啟用終止符會(huì)有什么效 果呢?終止符的意思就是當(dāng)程序接收到這個(gè)字符時(shí),就認(rèn)為已經(jīng)到了所有數(shù)據(jù)的


未端了,從而停止接收,不管后面還有沒有數(shù)據(jù)。終止符是 10,表示在接收數(shù) 據(jù)時(shí),遇到 ASCII 碼為 10 的字符(即換行符)時(shí)就停止接收數(shù)據(jù)。

可以做一個(gè)很簡(jiǎn)單的試驗(yàn),先短接串口 2、3 腳,然后將終止符設(shè)置為“0x33”,
0x33 是字符“3”的 ASCII 碼,然后發(fā)送字符串可以看到接收回來的數(shù)據(jù)中只有 “12”,即“3”被認(rèn)為是字符串的未端了,它后面的數(shù)據(jù)就不再接收了。很多朋友 就是因?yàn)檫@里設(shè)置錯(cuò)誤,導(dǎo)致接收數(shù)據(jù)時(shí)有時(shí)候只收到一半就沒有了,特別是在 連續(xù)接收數(shù)據(jù)時(shí),但又不是每次都只能收到一半,有時(shí)候也能接收齊全的,就是 因?yàn)榘l(fā)送的數(shù)據(jù)中可能包含了終止符而使串口認(rèn)為到了最后一個(gè)字符了。一般是 將這個(gè)終止符禁用掉,即將“啟用終止符?(Enable terminator?)”這一端輸入為 False 即可。


另外還有一個(gè)比較重要的設(shè)置,就是 VISAREAD 的“讀取字節(jié)數(shù)”這個(gè)輸入,由 于在串口通信中,如果指定讀取 100 個(gè)串口緩沖區(qū)的字節(jié)數(shù),如果當(dāng)前緩沖區(qū)的 數(shù)據(jù)量不足 100 個(gè)時(shí),程序會(huì)一直停在 VISA READ 這個(gè)節(jié)點(diǎn)上,如果在超時(shí)的 時(shí)間(默認(rèn)是 10 秒)內(nèi)還沒有湊足 100 個(gè)數(shù)據(jù)的話,程序就會(huì)報(bào)“Timeout”的錯(cuò) 誤,如果超時(shí)時(shí)間設(shè)置得太長,有可能導(dǎo)致程序很長時(shí)間停止在 VISA READ 這 個(gè) 節(jié) 點(diǎn) 上 。 解 決 的 辦 法 是 使 用 “Bytes atPort” 這 個(gè) 串 口 的 屬 性 節(jié) 點(diǎn) , 在 VISA>>Serial>>advance 下,也可以在 VISA 資源線上右鍵>>創(chuàng)建>>屬性節(jié)點(diǎn)>> 串口設(shè)置>>Bytes atPort,如下圖:





圖 3 Bytes at Port

這個(gè)屬性節(jié)點(diǎn)讀取當(dāng)前串口緩沖區(qū)有字節(jié)數(shù),然后將它的輸出連接到 VISA READ 的“讀取字節(jié)數(shù)”這個(gè)輸入端上即可,這樣當(dāng)前緩沖區(qū)中有多少個(gè)字節(jié)就讀 回多少個(gè),不會(huì)有任何等待。




圖 4 使用 Bytes at Port



5.LabVIEW中使用串口


目前串口的應(yīng)用一般有二種類型的(以我接觸到的來分類,不嚴(yán)格),一種是儀 器控制類型的,一般是上位機(jī)發(fā)送一個(gè)指令,然后下位機(jī)作出響應(yīng),返回?cái)?shù)據(jù)給 上位機(jī),上位機(jī)再讀取出來,完成一次通信,即一問一答;另一類是被動(dòng)接收形 的,即下位機(jī)會(huì)一直發(fā)送數(shù)據(jù)上來。這二種類型的串口通信在處理上會(huì)不太一樣。



5.1儀器控制類型


由于在儀器控制時(shí)一般都是這種一問一答的方式,所以叫它儀器控制類型。以儀 器控制為例來說一下需要注意的事項(xiàng)。

首先是要確認(rèn)儀器選擇的通信模式是串口通信模式。現(xiàn)在的儀器一般都至少有二 種通信模式,一種是 RS232,一種是 GPIB,如果儀器是設(shè)置為 GPIB 通信的話, RS232 是不可能通信上的,所以要先確認(rèn)一下,方法一般是在儀器面板上選擇設(shè) 置>>遠(yuǎn)程控制>>GPIB/RS232,各個(gè)儀器稍微不同,可以查儀器手冊(cè)看一下。


然后就是確認(rèn)串口的通信參數(shù)的配置,包括波特率、數(shù)據(jù)長度、校驗(yàn)方法等,有 些儀器的某些參數(shù)是固定的,比如校驗(yàn)方法固定為奇校驗(yàn),不能修改,只能在電 腦上跟儀器設(shè)置為一樣的。波特率一般是可以修改的。這些參數(shù)的配置一定要根 據(jù)儀器手冊(cè)上的來設(shè)置。如果參數(shù)設(shè)置不正確,也能收到一些數(shù)據(jù),但一般是亂 碼,如果收到的數(shù)據(jù)都是亂碼的話,就要先檢查一下串口參數(shù)設(shè)置是否正確了。 只有電腦和儀器邊的串口參數(shù)完全一致時(shí)才能收到正確的數(shù)據(jù)。

接著是要注意發(fā)送指令和讀回?cái)?shù)據(jù)之間要有一定的延時(shí),即VISA WRITE 和 VISA READ 之間要有一定的延時(shí),一般 200 毫秒即可,因?yàn)榇谑堑讓佑布?數(shù)據(jù)從軟件到串口上要一點(diǎn)點(diǎn)時(shí)間,然后儀器對(duì)指令作出響應(yīng)也要一點(diǎn)點(diǎn)時(shí)間, 這些時(shí)間加起來肯定比軟件運(yùn)行二個(gè)節(jié)點(diǎn)的時(shí)間要短,所以延時(shí)是一定要加的。 在調(diào)試時(shí)如果發(fā)現(xiàn)正常運(yùn)行時(shí)不能收到數(shù)據(jù),但高亮運(yùn)行就能收到數(shù)據(jù),就很有 可能是沒有加延時(shí)的原因!


或者是發(fā)一個(gè)查詢指令,但返回的是上一條查詢指令的結(jié)果,也可能是因?yàn)闆]有 延時(shí)或延時(shí)不夠。


5.2被動(dòng)接收類型


被動(dòng)接收形的串口通信稍微麻煩一點(diǎn),由于上位機(jī)是被動(dòng)接收的,上位機(jī)不知道什么時(shí)候開 始下位機(jī)就已經(jīng)有數(shù)據(jù)上來了,很有可能下位機(jī)發(fā)送到一半時(shí),上位機(jī)剛好開始接收數(shù)據(jù), 這時(shí)只能接收到后面一半的數(shù)據(jù)了,所以對(duì)于這種通信,一般是采用數(shù)據(jù)幀的方式進(jìn)行通信。

這種數(shù)據(jù)幀的通信方式至少由三部分?jǐn)?shù)據(jù)組成:幀頭、數(shù)據(jù)、幀尾(如果數(shù)據(jù)是固定長度的 話,似乎幀尾也可以省掉)。

幀頭是為了告訴上位機(jī):從這以后的數(shù)據(jù)就是有用的數(shù)據(jù)了,相當(dāng)于約定好的暗號(hào),一般幀 頭至少會(huì)用二個(gè)以上字節(jié),如果只用一個(gè)字節(jié)的話,萬一數(shù)據(jù)中的數(shù)據(jù)跟這個(gè)幀頭一樣了就 會(huì)誤以為這個(gè)數(shù)據(jù)是幀頭從而導(dǎo)致解析數(shù)據(jù)出錯(cuò),幀尾的作用也差不多,告訴上位機(jī)從這之 前的數(shù)據(jù)才是有用的數(shù)據(jù)。但實(shí)際上一般的數(shù)據(jù)幀遠(yuǎn)不止這幾個(gè)部分,還會(huì)加上一些校驗(yàn)字 節(jié)、時(shí)間信息、幀計(jì)數(shù)器之類的東東在上面。

其中校驗(yàn)字節(jié)是為了檢查數(shù)據(jù)在傳輸過程中有沒有出錯(cuò)的,跟串口的校驗(yàn)位要區(qū)分清楚,校 驗(yàn)位也是檢查數(shù)據(jù)傳輸時(shí)有沒有出錯(cuò)的,但由底層硬件來實(shí)現(xiàn),校驗(yàn)方法由標(biāo)準(zhǔn)規(guī)定好,但 有幾種可以選擇,只有一個(gè)位(Bit,只能是0 或 1)。

校驗(yàn)字節(jié)是由軟件層來實(shí)現(xiàn)的,至少有一個(gè)字節(jié)(Byte,有 8 個(gè)位),而且校驗(yàn)方式由用戶 定義,非常靈活。

由于被動(dòng)方式中串口的緩沖區(qū)中一直會(huì)有數(shù)據(jù)在,為了保持?jǐn)?shù)據(jù)的連續(xù)性,在讀取數(shù)據(jù)時(shí) 跟第一種儀器控制類型不一樣。而是采取將讀取的所有的串口數(shù)據(jù)都保存在移位寄存器中, 在軟件上處理完這些數(shù)據(jù)后再將它們從移位寄存器中刪除。


由于 VISA READ 的輸出是字符串,所以一般使用“連接字符串”這個(gè)函數(shù)將它們連接起來, 然后接到循環(huán)結(jié)構(gòu)中的移位寄存器中進(jìn)行保存,當(dāng)移位寄存器中的數(shù)據(jù)量達(dá)到一定時(shí)或滿足 數(shù)據(jù)處理的條件時(shí),才停止這個(gè)循環(huán)輸出讀取到的數(shù)據(jù)。一般如下圖所示:

圖 5 被動(dòng)接收類型中的數(shù)據(jù)接收 在接收下位機(jī)發(fā)送的幀數(shù)據(jù)時(shí),一定要先了解幀格式,這樣才能正確解析出幀里面的數(shù)據(jù)來。 下面以例子來說明數(shù)據(jù)幀格式的通信。


設(shè)定通信數(shù)據(jù)幀每 7 個(gè)字節(jié)為一幀數(shù)據(jù),其中以 0xAC、0x96 二個(gè)字節(jié)作為數(shù)據(jù)幀頭,第三、 四個(gè)幀頭為幀計(jì)數(shù)器,最大值為 0xFFFF,到達(dá)最大值后重新從 0 開始計(jì)數(shù),第 4、5、6 三 個(gè)字節(jié)是數(shù)據(jù)信息,分別代表數(shù)據(jù)的高中低位,第 7 位為狀態(tài)標(biāo)志字節(jié),它的第一位為 1 時(shí)表示下位機(jī)出錯(cuò),為 0 時(shí)表示功能正常。


由于 LabVIEW 中接收到的數(shù)據(jù)都是以字符串的形式顯示出來的,所以需要將字符串轉(zhuǎn)換為
ASCII 碼,一般可以直接使用“轉(zhuǎn)換為 U8 數(shù)組”這個(gè)函數(shù),如下圖所示:




圖 5 字符串轉(zhuǎn)換為 U8 字節(jié)


轉(zhuǎn)換為 U8 字節(jié)后,得到的是所傳輸字符的 ASCII 碼,我們就很容易進(jìn)行數(shù)據(jù)幀的判斷了, 現(xiàn)收到以下的字符串?dāng)?shù)據(jù):


,     圖 6 實(shí)際接收到的字符串 上圖中下半部分顯示的數(shù)組是使用“字符串轉(zhuǎn)換為 U8 數(shù)組”的函數(shù)轉(zhuǎn)換之后得到的數(shù)組,一
個(gè)是十六進(jìn)制顯示,另一個(gè)為十進(jìn)制顯示。對(duì)照定義的數(shù)據(jù)幀格式,就很容易得到我們需要 的數(shù)據(jù)了。

首先是要看從哪里開始才是完整的第一幀,從上面十六進(jìn)制顯示的數(shù)組中我們可以看到,并 不是第一個(gè)字節(jié)就是我們需要的幀頭,因?yàn)橄挛粰C(jī)是一直處于發(fā)送數(shù)據(jù)的狀態(tài),很可能在串 口發(fā)送一幀數(shù)據(jù)的過程中串口就被初始化或者被清空了一次緩沖區(qū),那么這一幀數(shù)據(jù)的前面 部分?jǐn)?shù)據(jù)可能就會(huì)丟失,只留下后面一部分?jǐn)?shù)據(jù)。


以上圖為例子,第一二個(gè)字節(jié)為 0x32、0x22,顯示不是我們要的幀頭,我們要的幀頭是在 第 6、7 個(gè)字節(jié),以程序來實(shí)現(xiàn)的話就是先查找第一個(gè)幀頭,使用“搜索字符串”,如果找到 則判斷它下一個(gè)字節(jié)是否是第二個(gè)幀頭,如果是,表明已經(jīng)找到幀頭,輸出幀頭的位置;如 果它下一個(gè)字節(jié)不是第二個(gè)幀頭,說明這里不是真正的幀頭,繼續(xù)查找下一個(gè)幀頭,直到找 到幀頭或搜索完整個(gè)字符串都找不到幀頭。




這是一個(gè)程序的算法問題,具體實(shí)現(xiàn)的程序如下圖所示:



圖 7 幀頭查找程序 幀頭查找到以后,再找數(shù)據(jù)就容易了,根據(jù)之前的定義,第4、5、6 個(gè)字節(jié)是才是我們要的
數(shù)據(jù),所以直接使用索引號(hào)進(jìn)行索引輸出即可。

圖 8 獲取實(shí)際數(shù)據(jù) 一般情況下,如果是用三個(gè)字節(jié)表示一個(gè)數(shù)據(jù)的話,那么這三個(gè)字節(jié)分別表示為一個(gè)數(shù)據(jù)的
高中低字節(jié),即高字節(jié)要乘以 25536 再加上中字節(jié)乘以 256 再加上低字節(jié)的,這樣定義后可 表示的數(shù)據(jù)的范圍就會(huì)擴(kuò)大很多,但這里為了說明問題,直接認(rèn)為三個(gè)字節(jié)的數(shù)據(jù)相加就是 我們要的實(shí)際數(shù)據(jù),在實(shí)際使用過程中應(yīng)該根據(jù)幀格式的字義來解析這個(gè)數(shù)據(jù)。

另外幀格式中定義了最后一個(gè)字節(jié)為狀態(tài)標(biāo)志位,所以提取數(shù)據(jù)前還要檢查一下這個(gè)標(biāo)志位 是否正常,不正常時(shí)要進(jìn)行相應(yīng)的處理,這里不再詳細(xì)描述。
至此完成一次數(shù)據(jù)幀的提取。 如果是沒什么特殊的要求的話,這里應(yīng)該也算到一段落了,有一些對(duì)測(cè)試時(shí)間有要求的地方,
就會(huì)要求在最短的時(shí)間內(nèi)得到最多的信息。圖 6 中我們可以看到,接收到的數(shù)據(jù)幀中,除了
中間一個(gè)完整的幀之外,頭尾還有一些無用的數(shù)據(jù),其實(shí)這些數(shù)據(jù)中也包含了有用的信息的!


比如我們可以從 0xAC、0x96 這二個(gè)幀的位置中推斷中它前面的 0x22、0x2A、0x38 這三個(gè) 字節(jié)也是我們想要的數(shù)據(jù)字節(jié),但是由于沒有接收到它的幀頭,所以程序沒能提取出來,但 我們可以從后一幀的幀頭推算出前面那一幀的數(shù)據(jù)字節(jié)是哪些,即使沒收到前面那一幀的幀 這里只給出一個(gè)流程,不再給出具體的程序。


另外有可能接收的數(shù)據(jù)長度比較長,可能就不止包含了一幀的數(shù)據(jù)在里面,所以在程序中也 要判斷一下剩下的數(shù)據(jù)還夠不夠一幀的數(shù)據(jù)長度,如果夠則可以根據(jù)上一次查找的幀頭位置
+數(shù)據(jù)幀長度來確定下一個(gè)數(shù)據(jù)幀的幀頭位置了,不需要使用搜索的方法。也可能存在處理 完一幀數(shù)據(jù)后,剩下的數(shù)據(jù)不夠一個(gè)幀的,這時(shí)可以將這些剩下的數(shù)據(jù)保留起來,將它添加 到下一次接收到的數(shù)據(jù)前面,組成新的數(shù)據(jù)再進(jìn)行處理。去掉已經(jīng)處理的數(shù)據(jù)可以使用“刪 除數(shù)組元素”這個(gè)函數(shù)來實(shí)現(xiàn)。這里也不再給出具體的程序。



6.串口數(shù)據(jù)類型的轉(zhuǎn)換


由于 LabVIEW 中 VISA Read/Write 這二個(gè)函數(shù)都是只能讀取/寫入字符串類型的數(shù)據(jù)的,而 有時(shí)候需要接收/寫入的數(shù)據(jù)類型不一定是字符串,導(dǎo)致在剛開始接觸的時(shí)候會(huì)有一點(diǎn)困惑。

在進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),只要記住計(jì)算機(jī)中所有數(shù)據(jù)都是以二進(jìn)制保存這個(gè)原則就容易解決問題 了。串口線上傳輸?shù)囊彩歉叩停诮邮盏降囊彩嵌M(jìn)制數(shù)據(jù),只是到 LabVIEW 后被轉(zhuǎn)換 為字符串格式了。還是以例子進(jìn)行解釋。



6.1LabVIEW從串口接收數(shù)據(jù)


①假設(shè) LabVIEW 從串口接收到的數(shù)據(jù)為“1234”(正常顯示模式下),那么這個(gè)數(shù)據(jù)在串口 底層的時(shí)候其實(shí)是這樣的二進(jìn)制數(shù)據(jù):


00110001 00110010  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ù):





圖 9 字符串轉(zhuǎn)換為字節(jié)數(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 碼解讀。



6.2使用 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)的字符串通過 VISA Write 發(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ù)值類型。具體程序如下圖所示。
圖 10 正常顯示字符串轉(zhuǎn)換為相同的十六進(jìn)制顯示的字符串 由于十六進(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”再使用上面的程序就正常了。



7.串口問題匯總:


7.1串口資源被占用:


這時(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)榇诒辉瓉?/div>
的 LabVIEW 程序打開,再用 EXE 打開時(shí)就會(huì)報(bào)錯(cuò),解決辦法是關(guān)掉原來的 LabVIEW 程序。
最好是關(guān)掉 LabVIEW.

在使用串口的過程中一定要關(guān)閉串口(使用 VISA CLOSE),否則程序在退出的時(shí)候會(huì)報(bào)錯(cuò) 說數(shù)據(jù)丟失。


完整的pdf格式文檔51黑下載地址:

LabVIEW串口通信教程good.pdf (512.49 KB, 下載次數(shù): 109)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:378228 發(fā)表于 2018-8-3 09:46 | 只看該作者
看樣子不錯(cuò)
回復(fù)

使用道具 舉報(bào)

板凳
ID:20672 發(fā)表于 2018-9-21 12:23 | 只看該作者
謝謝!!!
回復(fù)

使用道具 舉報(bào)

地板
ID:421778 發(fā)表于 2018-11-7 09:17 | 只看該作者
內(nèi)容和帖子內(nèi)容一致,,浪費(fèi)幾個(gè)黑幣
回復(fù)

使用道具 舉報(bào)

5#
ID:422818 發(fā)表于 2018-11-8 10:41 | 只看該作者
感謝分享,學(xué)習(xí)中。
回復(fù)

使用道具 舉報(bào)

6#
ID:152957 發(fā)表于 2018-11-17 19:47 | 只看該作者
有點(diǎn)貴了啊
回復(fù)

使用道具 舉報(bào)

7#
ID:422818 發(fā)表于 2018-11-21 13:18 | 只看該作者
初學(xué)者,感謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:457452 發(fā)表于 2018-12-28 17:00 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

9#
ID:337950 發(fā)表于 2019-6-18 14:50 | 只看該作者
感謝樓主,下載學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜在线精品 | 国产你懂的在线观看 | 亚洲自拍偷拍欧美 | 午夜影院中文字幕 | 亚洲成人av | 综合一区二区三区 | 成年网站在线观看 | 找个黄色片 | av在线播放网站 | 一级黄色生活视频 | 亚洲在线观看视频 | 亚洲国产二区 | 中文字幕一区二区三区在线观看 | 亚洲一区视频在线 | 成人国产一区二区三区精品麻豆 | 精品丝袜在线 | 国产精品美女一区二区 | 91极品视频| 亚洲一区二区三区四区五区中文 | 91麻豆精品国产91久久久更新资源速度超快 | 一级毛片黄片 | 91久久精品一区二区二区 | 久久久久久国产精品免费免费狐狸 | 久久久久久久久91 | 亚欧洲精品在线视频免费观看 | 国产电影一区 | 二区三区视频 | 国产成人精品999在线观看 | 精品国产一区二区三区观看不卡 | 超碰97人人人人人蜜桃 | 色.com| 久久综合狠狠综合久久综合88 | 亚洲综合一区二区三区 | 操视频网站| 精品久久影院 | 国产高清免费 | 91免费看片 | 在线啊v | 国产在线中文字幕 | 91免费观看视频 | 久操av在线|