LabVIEW-TCP/IP資料傳輸

2020/10/25閱讀時間約 3 分鐘

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

raw-image

 

接收端(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

raw-image

 

資料傳送接收的部份

可以看到不是直接一個指令就把資料處理掉

當然我們可以跟範例一樣隨便設定一個數字為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型態的功用

=================================

raw-image

在做傳輸測試時偶而會出現像這樣記憶體不足的錯誤訊息

這不是因為硬體的記憶體不足, 而是程式在處理byte to read的數字時出了錯

導致讀取資料需要的記憶體太大

 

找到的解法有兩個

第一個是在兩次傳輸/接收間放一個delay指定, 設為0ms也可以

這個方法實際測試結果是可以改善, 但無法完全根除問題

raw-image

 

另一個解法是TX端傳輸長度和傳輸資料本體合併成一筆資料一次傳出

反正RX端有正確資料長度就可以分別正確讀出兩筆資料

目前用這個解法完全不會再出現記憶體不足的錯誤訊息

raw-image

 

另外在用兩台電腦做連線測試時發現有些電腦會有無法連接的狀況

推測是防火牆或某些網路設定被關閉造成

目前我是把共享檔案和印表機選項啟用就可以了

接下來要用TCP/IP功能製作LabVIEW多人連線通訊系統 (AKA 聊天室)

 

    5會員
    56內容數
    ktest
    留言0
    查看全部
    發表第一個留言支持創作者!