LabVIEW做最基本的TCP/IP資料傳輸和可能遇到的問題處裡
準備兩個VI, 分別是傳輸端(TX)和接收端(RX)
流程是: TX先啟動等待連線-->RX建立連線-->TX送出資料-->RX接收資料-->結束
詳細說明如下:
傳輸端利用TCP listen來建立一個listner(或server)等待接收端連線
連線建立後, 用TCP write將資料字串送出
其中TCP listen的Service name接點其實是非必要的, 除非把port設成0讓程式隨機設定
另外TCP listen僅能提供一組連線, 如果要建立多組連線需使用TCP Create Listener
搭配TCP Wait On Listener
接收端(RX)的部份用TCP Open Connection來建立連線
連線成功後用TCP Read來接收TX傳出的資料
Remote port接點可以選擇輸入特定port或者是service name
取決於TX端的設定
輸入listner IP是必要的, 這邊用本機伺服器127.0.0.1來測試
用localhost也是可以, 但他是不通過網卡傳輸
也有可能因為變更過系統host文件而不是127.0.0.x
資料傳送接收的部份
可以看到不是直接一個指令就把資料處理掉
當然我們可以跟範例一樣隨便設定一個數字為byte to read
但這樣連續傳輸時就會讀到不正確的字串
為了精準的傳送接收正確大小的資料, 避免接收過多或過少
TX端傳送前我們用string length先取得字串長度, 會得到型態是 I32的數字
再把數字casting成字串,放在要傳送的資料前先傳出
RX接收時先讀取4個Byte的資料, casting回 I32就是正確的資料長度
4個Byte是因為 I32的儲存空間就是32bits=4Bytes
I32數值範圍可以到2,147,483,647足夠應付一般的一次傳輸量了
程式碼裡的數值常數"4"資料型態就是 I32
所以他除了設定第一次讀取的byte數外,同時還有設定casting型態的功用
=================================
在做傳輸測試時偶而會出現像這樣記憶體不足的錯誤訊息
這不是因為硬體的記憶體不足, 而是程式在處理byte to read的數字時出了錯
導致讀取資料需要的記憶體太大
找到的解法有兩個
第一個是在兩次傳輸/接收間放一個delay指定, 設為0ms也可以
這個方法實際測試結果是可以改善, 但無法完全根除問題
另一個解法是TX端傳輸長度和傳輸資料本體合併成一筆資料一次傳出
反正RX端有正確資料長度就可以分別正確讀出兩筆資料
目前用這個解法完全不會再出現記憶體不足的錯誤訊息
另外在用兩台電腦做連線測試時發現有些電腦會有無法連接的狀況
推測是防火牆或某些網路設定被關閉造成
目前我是把共享檔案和印表機選項啟用就可以了
接下來要用TCP/IP功能製作LabVIEW多人連線通訊系統 (AKA 聊天室)