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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LabVIEW串口通信教程

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

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

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


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

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



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


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




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

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




3
.串口線的檢查:


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


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


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


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

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



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




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

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


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


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

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


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





圖 3 Bytes at Port

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




圖 4 使用 Bytes at Port



5.LabVIEW中使用串口


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



5.1儀器控制類型


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

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


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

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


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


5.2被動接收類型


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

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

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

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

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

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


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

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


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


由于 LabVIEW 中接收到的數(shù)據(jù)都是以字符串的形式顯示出來的,所以需要將字符串轉(zhuǎn)換為
ASCII 碼,一般可以直接使用“轉(zhuǎn)換為 U8 數(shù)組”這個函數(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ù)組,一
個是十六進(jìn)制顯示,另一個為十進(jìn)制顯示。對照定義的數(shù)據(jù)幀格式,就很容易得到我們需要 的數(shù)據(jù)了。

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


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




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



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

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

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


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


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



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


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

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



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


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


00110001 00110010  00110011  00110100

只是在 LabVIEW 中,這些二進(jìn)制數(shù)據(jù)是以字符串形式顯示出來的,它們的實(shí)質(zhì)還是二進(jìn)制 數(shù)據(jù),這幾個二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為十進(jìn)制數(shù)據(jù)分別是“49,50,51,52”,由于字符串都是以 ASCII 碼形式保存在計算機(jī)中的,那么 49,50,51,52 這幾個數(shù)在 ASCII 表中就表示是字 符串“1,2,3,4”。所以這幾個數(shù)據(jù)在 LabVIEW 中就顯示為字符串的 1,2,3,4 了。


如果明白這里面的轉(zhuǎn)換關(guān)系,那么要進(jìn)行數(shù)據(jù)轉(zhuǎn)換時就很容易了,比如上面的例子中,如果 LabVIEW 中接收到的是字符串“1234”,而原本下位機(jī)傳送的是數(shù)值型數(shù)據(jù),只需要將“1234” 字符串轉(zhuǎn)換為對應(yīng)的 ASCII 值就是實(shí)際上下位機(jī)傳上來的數(shù)據(jù)了,就是“49,50,51,

LabVIEW 中將字符串轉(zhuǎn)換為對應(yīng)的 ASCII 值的函數(shù)是“字符串至字節(jié)數(shù)組轉(zhuǎn)換”這個函數(shù):





圖 9 字符串轉(zhuǎn)換為字節(jié)數(shù)組

上面說的是下位機(jī)發(fā)送的是數(shù)值類型的數(shù)據(jù)的,使用“字符串至字節(jié)數(shù)組轉(zhuǎn)換”這個函數(shù).
②如果是下位面發(fā)送的是字符串類型的數(shù)據(jù),那么 LabVIEW 已經(jīng)直接轉(zhuǎn)換好了。 個人總結(jié):無論下位機(jī)發(fā)送的是何種類型的數(shù)據(jù),LABVIE 從串口接收的時候,總是將每 8位二進(jìn)制數(shù),作為字符的 ASCII 碼解讀。



6.2使用 LabVIEW發(fā)送數(shù)據(jù)


還有一個問題是使用 LabVIEW 發(fā)送數(shù)據(jù)的問題

①如果下位機(jī)接收的是字符串?dāng)?shù)據(jù)類型的話,直接用 VISA 寫入對應(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í)際使用過程中,一般都是需要將某個子 VI 輸出一個動態(tài)的字符串通過 VISA Write 發(fā)送 到下位機(jī)的,這時候就需要對數(shù)據(jù)進(jìn)行轉(zhuǎn)換一下,這個轉(zhuǎn)換過程描述起來就是:將字符串 A 轉(zhuǎn)換為字符串 B,使得正常顯示的字符串 A 跟十六進(jìn)制顯示的字符串 B 是一樣的。

由于轉(zhuǎn)換目標(biāo)(十六進(jìn)制顯示的字符串)的數(shù)據(jù)類型是十六進(jìn)制,要想十六進(jìn)制顯示的字符 串跟正常顯示的字符串一樣,這個正常顯示的字符串必須都是十六進(jìn)制的字符,即只能由
0-9,A-F 這十六個字母中的字母組合而成。否則就沒辦法使二種顯示方式的字符串一致了。


這個轉(zhuǎn)換過程首先將字符串轉(zhuǎn)換為十六進(jìn)制數(shù)值型,然后再通過將這個十六進(jìn)制數(shù)值創(chuàng)建為 一個數(shù)組,最后再使用“字節(jié)數(shù)組至字符串轉(zhuǎn)換”這個函數(shù)轉(zhuǎn)換為字符串即可,實(shí)際上就是圖
5 字符串轉(zhuǎn)換為 U8 字節(jié)的反向操作,只不過是這個十六進(jìn)制的值初始類型是十六進(jìn)制,要 先轉(zhuǎn)換為數(shù)值類型。具體程序如下圖所示。
圖 10 正常顯示字符串轉(zhuǎn)換為相同的十六進(jìn)制顯示的字符串 由于十六進(jìn)制數(shù)據(jù)由二個字節(jié)構(gòu)成,而字符只有一個字符,所以每二個字符表示一個十六進(jìn)
制數(shù)據(jù),如果字符多于二個的話要先進(jìn)行截取,每二個字符轉(zhuǎn)換為一個十六進(jìn)制數(shù)據(jù)。也可 以用空格將正常顯示的字符串每二個字符用一個空格斷開,然后先將這個字符串以空格為分 隔符轉(zhuǎn)換為一個字符串?dāng)?shù)組,再轉(zhuǎn)換為十六進(jìn)制數(shù)值再轉(zhuǎn)換為字符串。

需要注意一下的是如果正常顯示的字符串并不是 2 的整數(shù)倍,那么上圖的轉(zhuǎn)換程序就會少轉(zhuǎn) 換一個字符,可以用程序動態(tài)判斷一下這個字符串的長度,如果是奇數(shù)的話在它最左邊補(bǔ)一 個“0”再使用上面的程序就正常了。



7.串口問題匯總:


7.1串口資源被占用:


這時候在 LabVIEW 會報錯,提示串口號存在,但當(dāng)前不能對其進(jìn)行操作,同時打開 MAX 時也可以在對應(yīng)的串口號下看到同樣的錯誤,這表示這個串口已經(jīng)被其它程序占用了,比如 有時候打開了串口調(diào)試助手來調(diào)試串口,然后又想在 LabVIEW 里面試一下,這時就會報這 個錯,因?yàn)榇谝呀?jīng)被串口調(diào)試助手調(diào)用了,它不能被二個程序同時使用。
解決的方法是關(guān)掉其它程序即可,串口調(diào)試助手里也可以關(guān)閉這個串口。 還有一種情況是調(diào)試 OK 后生成 EXE,運(yùn)行 EXE 也出現(xiàn)這個問題,這時是因?yàn)榇诒辉瓉?/div>
的 LabVIEW 程序打開,再用 EXE 打開時就會報錯,解決辦法是關(guān)掉原來的 LabVIEW 程序。
最好是關(guān)掉 LabVIEW.

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


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

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


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日干夜操 | 亚洲a人 | 久草网址 | 亚洲精品视 | 国产电影一区二区三区爱妃记 | 免费精品在线视频 | 亚洲一av | 大象视频一区二区 | 国产亚洲精品精品国产亚洲综合 | 欧美日韩亚洲视频 | 一区二区三区免费 | 亚州精品天堂中文字幕 | 亚洲 精品 综合 精品 自拍 | 久久精品免费 | 天天影视亚洲综合网 | 男人天堂网站 | 日本成人免费网站 | 91精品国产91久久久久久密臀 | 亚洲欧美成人在线 | 巨大黑人极品videos精品 | 精品欧美乱码久久久久久1区2区 | 在线亚洲一区 | 麻豆亚洲 | 亚洲品质自拍视频网站 | 亚洲天堂日韩精品 | aaa精品 | 午夜噜噜噜 | 青青草国产在线观看 | 亚州av | 中文字幕91| 在线观看中文字幕dvd播放 | 91精品国产日韩91久久久久久 | 精品一二三区 | 久久久久久久久91 | 久久五月婷 | 日韩一区二区在线视频 | 人人射人人插 | 九九九视频 | 久久久精 | 毛片网在线观看 | 美人の美乳で授乳プレイ |