欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10960|回復: 8
打印 上一主題 下一主題
收起左側

LabVIEW串口通信教程

  [復制鏈接]
跳轉到指定樓層
樓主
ID:315961 發表于 2018-4-25 09:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
LabVIEW串口通信教程,見附件,收集于網絡,給需要參考的朋友

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

首先補充一個比較重要的問題,就是在 LabVIEW 中使用串口的話一定要先安裝 VISA 這個驅動,然后生成的 EXE 運行時也需要在目標機上安裝 VISA Runtime Engine,可以在打包時一起打包。


1.串口擴展的問題:

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



2.串口功能的確認:


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




圖 1 串口調試助手

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




3
.串口線的檢查:


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


G 串口線還有一個地方需要注意一下的,就是 2、3 腳的接法,標準接法中是 2、
3 腳交叉的,即這邊的 2 接另一邊的 3,這邊的 3 接另一邊的 2,扭了一下,所以叫交叉線,因為正常使用時,這邊第二腳是發送數據,另一邊第三腳是接收數 據,所以要將這二個管腳連接起來,這樣才能正常使用。但是有些情況下,2、3 是直連的,即這邊的第 2 腳連接另一邊的第 2 腳,第 3 腳連接第 3 腳,這種叫直 連線,這種線一般是用于延長串口的,比如需要將工控機的串口接頭引到機柜表


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


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

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



4.串口參數設置:




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

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


而“禁用終止符?”的默認值是 FALSE,即啟用終止符,啟用終止符會有什么效 果呢?終止符的意思就是當程序接收到這個字符時,就認為已經到了所有數據的


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

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


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





圖 3 Bytes at Port

這個屬性節點讀取當前串口緩沖區有字節數,然后將它的輸出連接到 VISA READ 的“讀取字節數”這個輸入端上即可,這樣當前緩沖區中有多少個字節就讀 回多少個,不會有任何等待。




圖 4 使用 Bytes at Port



5.LabVIEW中使用串口


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



5.1儀器控制類型


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

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


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

接著是要注意發送指令和讀回數據之間要有一定的延時,即VISA WRITE 和 VISA READ 之間要有一定的延時,一般 200 毫秒即可,因為串口是底層硬件, 數據從軟件到串口上要一點點時間,然后儀器對指令作出響應也要一點點時間, 這些時間加起來肯定比軟件運行二個節點的時間要短,所以延時是一定要加的。 在調試時如果發現正常運行時不能收到數據,但高亮運行就能收到數據,就很有 可能是沒有加延時的原因!


或者是發一個查詢指令,但返回的是上一條查詢指令的結果,也可能是因為沒有 延時或延時不夠。


5.2被動接收類型


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

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

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

其中校驗字節是為了檢查數據在傳輸過程中有沒有出錯的,跟串口的校驗位要區分清楚,校 驗位也是檢查數據傳輸時有沒有出錯的,但由底層硬件來實現,校驗方法由標準規定好,但 有幾種可以選擇,只有一個位(Bit,只能是0 或 1)。

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

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


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

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


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


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




圖 5 字符串轉換為 U8 字節


轉換為 U8 字節后,得到的是所傳輸字符的 ASCII 碼,我們就很容易進行數據幀的判斷了, 現收到以下的字符串數據:


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

首先是要看從哪里開始才是完整的第一幀,從上面十六進制顯示的數組中我們可以看到,并 不是第一個字節就是我們需要的幀頭,因為下位機是一直處于發送數據的狀態,很可能在串 口發送一幀數據的過程中串口就被初始化或者被清空了一次緩沖區,那么這一幀數據的前面 部分數據可能就會丟失,只留下后面一部分數據。


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




這是一個程序的算法問題,具體實現的程序如下圖所示:



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

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

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


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


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



6.串口數據類型的轉換


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

在進行數據轉換時,只要記住計算機中所有數據都是以二進制保存這個原則就容易解決問題 了。串口線上傳輸的也是高低,串口接收到的也是二進制數據,只是到 LabVIEW 后被轉換 為字符串格式了。還是以例子進行解釋。



6.1LabVIEW從串口接收數據


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


00110001 00110010  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 值的函數是“字符串至字節數組轉換”這個函數:





圖 9 字符串轉換為字節數組

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



6.2使用 LabVIEW發送數據


還有一個問題是使用 LabVIEW 發送數據的問題

①如果下位機接收的是字符串數據類型的話,直接用 VISA 寫入對應的字符串就行了,現在 的儀器一般都是接收字符串的,所以可以直接使用 VISA 發送而不需要轉換。

②如果下位機接收的是數值型數據的話,就需要轉換一下,其中數值型又是十進制和十六進 制二種用得比較多,這二種數據間相互轉換一下就行了,其實是一樣的。


由于在 LabVIEW 中字符串直接有十六進制的顯示方式,所以發送十六進制的數據比較方便, 比如要發送十六進制數值類型的“0xAF”,那么在 VISA Write 的寫入緩沖區字符串常量上右 鍵>>十六進制顯示,如圖 1,直接輸入“AF”即可,那么下位機接收到的就是正確的數據(十 六進制數值類型)了。


但實際使用過程中,一般都是需要將某個子 VI 輸出一個動態的字符串通過 VISA Write 發送 到下位機的,這時候就需要對數據進行轉換一下,這個轉換過程描述起來就是:將字符串 A 轉換為字符串 B,使得正常顯示的字符串 A 跟十六進制顯示的字符串 B 是一樣的。

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


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

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



7.串口問題匯總:


7.1串口資源被占用:


這時候在 LabVIEW 會報錯,提示串口號存在,但當前不能對其進行操作,同時打開 MAX 時也可以在對應的串口號下看到同樣的錯誤,這表示這個串口已經被其它程序占用了,比如 有時候打開了串口調試助手來調試串口,然后又想在 LabVIEW 里面試一下,這時就會報這 個錯,因為串口已經被串口調試助手調用了,它不能被二個程序同時使用。
解決的方法是關掉其它程序即可,串口調試助手里也可以關閉這個串口。 還有一種情況是調試 OK 后生成 EXE,運行 EXE 也出現這個問題,這時是因為串口被原來
的 LabVIEW 程序打開,再用 EXE 打開時就會報錯,解決辦法是關掉原來的 LabVIEW 程序。
最好是關掉 LabVIEW.

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


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

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


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:422818 發表于 2018-11-8 10:41 | 只看該作者
感謝分享,學習中。
回復

使用道具 舉報

6#
ID:152957 發表于 2018-11-17 19:47 | 只看該作者
有點貴了啊
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

9#
ID:337950 發表于 2019-6-18 14:50 | 只看該作者
感謝樓主,下載學習
回復

使用道具 舉報

10#
無效樓層,該帖已經被刪除
11#
無效樓層,該帖已經被刪除
12#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表