建議大家按我發帖子的順序來看,方便大家理解。請不要跳躍式的閱讀。很多人現在看書,都跳躍式的看,選擇性的看,導致有些細節的部分沒有掌握到,然后又因為某個細節耽誤很多時間。以上只是個人建議,高手可以略過本帖。
從手把手系列第 1 貼我就寫了,用 LabVIEW 來寫串口驅動控制儀器,只需要下圖的幾個函數即可。
事實上,真的只需要下面幾個函數。
<ignore_js_op>
所以,
LabVIEW 寫個串口程序,其實很簡單的。
問題是,有很大部分的人,問的就是串口,這個問題,那個問題。沒寫過串口的人可能會問:你都說了串口很簡單啊,就那么幾個函數,為什么還有這么多人在問?
我只能回答:不注重細節和自己的程序思維。
一般的串口控制結構是:
①配置(打開)串口
②讀寫串口
③關閉串口
我覺得這幾個之間,配置 VISA 串口,是個很需要斟酌的部分。配置串口是進入串口通訊的鑰匙。首先你配置成功了,才能進行正確的通訊。
下面開始進入正題,先看下 VISA 配置串口函數。
<ignore_js_op>

配置串口時候,最好是在對應的
參數端口那里,右鍵,新建常量或者輸入控件,然后
再在新建出來的上面修改。因為,新建出來的數據類型,肯定是對的。
<ignore_js_op>

需要注意的是:①停止位那里,不是常數 1 1.5 2 等,實際是 10,15,20 數值。這里最好右鍵新建常量然后選擇對應的枚舉類型,如上圖所示。
更需要注意的是:②配置串口,頂端有個
啟用終止符,一般默認是
真,終止符一般默認是
OA,即換行符。
<ignore_js_op>

有些人接受的字符串,里面含有十六進制的 OA,然后每次數據接收到 OA 就停止了,然后就以為程序有什么問題,其實就是沒有配置好 VISA,終止符沒有設定為 假。
那為什么配置 VISA 要搞個終止符呢?
(注意:這個函數的終止符,只是接受的終止符,只是對 LabVIEW 接收而言,后面會具體講。)
終止符,是個條件,很多儀器上,也有終止符,而且終止符的優先級高。
比如你要用”VISA 讀取“接收 1000 個字符,而還沒接受完畢,收到了終止符 OA,那么程序就當一個命令結束了。后面的字符串,放入下一個命令里面去。對編程很方便的,如果你傳輸的字符不可能出現 OA 或者自己設定的終止符,我建議用終止符來做終止條件,這樣,比你在 VISA 讀去里讀取固定的字節好很多。
<ignore_js_op>

<ignore_js_op>
首先看下 VISA 讀取幫助。左邊輸入有個必填參數,叫 VISA 字節總數,你必須指定你要讀的字節數。

好了,說到了 VISA 讀取,我們順帶看下 VISA 讀取。
問題來了,這個字節數怎么確定呢?
一般的組合,如上圖所示。
組合的前面,是 VISA 串口字節數,函數路徑見上圖,其實就是一個屬性節點,看那個 bytes at port 英文就應該明白了。
它利用一個讀取緩沖區字節數,讀到字節數,就確定了 VISA 讀取里面那個字節數,然后用讀取 VISA 讀出來。
意思就是,前面的先偵測下串口緩沖區有多少數據,偵測完了就告訴 VISA 讀,
VISA就全讀出來,。
這個組合的功能是,讀取 VISA 串口已有的全部數據。
很多人,也不明白什么意思,看到很多地方這么用,然后自己也這么用。還有的時候,如果是用 MODBUS 協議,你發送一個命令,會回復固定的字節數,這樣 VISA 讀取那個參數就確定了。
注明一點:串口有個緩沖區,存在計算機內存里,
VISA 讀取,就是從緩沖區讀取數
據,讀完之后,讀取的就不存在緩沖區里了。如果你沒讀取,那就一直在緩沖區里,直到緩沖區溢出。其實就好比一個水桶,寫 VISA 是往水桶進水,讀 VISA 是出水。你也可以想想隊列的原理,差不多的。
現在看下圖。
我用借助串口調試助手和虛擬串口,向 LabVIEW 編寫的一個最簡單的例子發送字符串。發送的字符串是 010203 0A 050607(十六進制顯示)。VISA 串口配置我沒都默認,結果我收到的字符串接收到 0A,就終止了。后面的 050607,到了下一次接收了。
這個例子很形象吧。
說明了終止符的厲害,默認不配置就是啟用終止符,終止符是 OA。
<ignore_js_op>

<ignore_js_op>

<ignore_js_op>

以上程序,先配置串口,然后循環不停的讀串口,用了讀取串口字節判斷該不該讀,當串口有數據,即字節數不位零時,讀取串口。
關鍵詞:VISA 配置,停止位,終止符。
深入篇:
以上我們已經講了 VISA 配置串口函數,熟悉串口通訊的,都應該熟悉這些參數的配置。然后需要注意的:
停止位,跟終止符,我也給大家特別說明了。其實,這個函數,也不是最底層的 vi,你可以雙擊這個 vi,打開子 vi。
程序面板如下:
<ignore_js_op>

其實就是屬性節點了,只是給出了常用的幾個而已。
事實上,有些儀器,我們要配置的可能多一點。
這個“VISA 配置串口”函數滿足不了要求。
具體配置,看你的儀器說明書,有些可能需要發送終止符, 有些需要握手協議。至於為什么要那些,都是儀器配置問題。自己通訊配置跟儀器一樣的就行了。
===================================================
下面我們以 Keithley 2400 儀器來講解。這個驅動來源於 NI 官網的儀器驅動。
<ignore_js_op>

我們打開一個例子:
Read Single
,就是讀取單個點的值。例子無所謂,我們今天主要講的核心是 VISA 串口配置。然后我們點擊最開始的 Ini
tialize.vi,就是這個儀器驅動的串口初始化程序。點擊去后,如下圖所示:
<ignore_js_op>

我們分兩部分講,我畫了兩個圈。
====================
第一個圈:首先打開串口,然后清除串口的緩沖,然后,看到了一個屬性節點。我們來放大它,看到第一行:
timeout.
這個是個超時,然后下面有個用戶數據,再下面是個串口類型。
<ignore_js_op>

首先,超時是個什么意思呢?
LabVIEW 很多地方都有超時,特別是涉及到
通信的,
TCP 有,串口有,藍牙有,隊列有,通知有。
超時,其實是個約定。
打個比方:男女朋友約會幾點見面,然后如果沒有加超時,如果一方沒來,另一方要一直等一直等,等到天荒地老…
但是,你們可以約定好,如果超過半小時,就不要等我了,說明我不來了。那你過了半小時,就可以走了,說明約會取消。
這個超過半小時,就取消約會。其實就是一個超時設置為半小時。
你也可以想象成打電話,撥對方電話,一分鍾過去還沒人接,就不再撥打。
你不設置超時,或者超時無限大,如果你讀取 VISA,程序就一直在等 VISA 讀取,一直等啊等啊,這時候你程序基本屬於假死狀態了,沒救了。。。其他的操作也一樣,可能一直等操作完成。
如果你設置了超時,等待超時時間到了,程序就不執行了,錯誤輸出會輸出錯誤。
其次,用戶數據是什么意思呢?
其實就是一個變量,存在串口相關的內存里。自己以后變成會用到讀取出來進行數據判斷。具體怎么用看自己了。
你這里設置了用戶數據,可以在后面利用屬性節點讀取出來。有人肯定要
問,我自己設置一個全局變量,其他地方調用,不一樣么
?
回答,不一樣,你用這個不更簡單么?不需要重新建立變量,而且數據是跟着連線走的。
第三,串口類型是什么?
這個,有些儀器是有 GPIB 接口和 232 接口的,
GPIB 接口的需要買 GPIB 卡,使用的方式不一樣,但是指令是可以一樣的,為了驅動的通用性,就只能用程序判斷了,不用人來判斷。統自動檢測串口類型,執行對應的程序,很智能化吧。
==================================================
好了,下面是
第二個圈的內容。
<ignore_js_op>

這里都是屬性節點。會用屬性節點的,應該可以找到他們的配置,現在細講。
①ASRL End In。這個容易懂,串口接收終止符,這個“
VISA 配置串口”函數用的就是
②ASRL End Out。這個跟接收相對的,串口發送終止符。這個有點特殊。你加了這個后,加入你發送的是 A,如果有這個終止符並且啟用的終止符是 B,那么你發送出去的,實際是 AB 兩個字節。
③終止符。這里一般是 OD,也就是回車符,當然你可以自己定義。
④流控制。這個針對儀器,儀器上有流控制,就跟儀器一樣就可以了。具體什么意思,請百度,不需要搞清楚那么多,自己設置和儀器一樣就可以了。有 XON/XOFF DTR/DSR各種,跟儀器一樣。記得一定要一樣的啊。后面就沒什么講的了。
記得注意我
紅色標注的地方。有些儀器有這么些東西,所以,建議大家儀器,使用 NI
提供的驅動,這樣配置方面就不需要自己想太多,因為別人都配置好了。
有人可能會問,這些屬性節點怎么來的?
見下圖,當然,你也可以在應用程序那個
屬性節點,連接到 VISA 引用,也可以得到。
<ignore_js_op>

點擊選擇對應的屬性。

好了,串口配置就講完了。