新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > 學習LabVIEW(十一)——UTF8字符串解碼

        學習LabVIEW(十一)——UTF8字符串解碼

        作者: 時間:2017-01-09 來源:網絡 收藏
        之前在《同步Android設備和Windows PC的Clipboard》中,我們用Python實現了一套PC和Android的Clipboard同步程序,其中通信方式使用的是UDP。我今天想,在LabVIEW中實現UDP通信的程序框圖會是一個什么樣子呢?可能會比較麻煩吧。試過之后,才發現,簡易的UDP通信并不麻煩,麻煩的是字符串的編解碼問題。我們在Android上實現的腳本通過UDP傳輸使用UTF8編碼過的字符串,而LabVIEW(Windows平臺)顯然不支持UTF8字符串的解碼,Google之后才知道LabVIEW使用系統默認的編碼,在中文的Windows中,大概用GBK就可以。我又繼續Google了LabVIEW中有什么節點可以實現字符串的編解碼,結果出人意料的是沒有,大家都是通過調用dotNET的方式實現編解碼的。本《學習LabVIEW》之前有好幾篇都是討論調用dotNET對象的,所以使用dotNET并沒有什么問題,但是這里我想換一種方式:通過MATLAB節點實現字符串的解碼。可能有人會覺得奇怪,MATLAB也能做這種事情嗎?答案是肯定的,在好多年前,我們在《我發現Matlab可以用來解亂碼》中就利用MATLAB的unicode2native和native2unicode實現過這樣的操作。
        首先還是看一下UDP通信的問題。Android端的QPython腳本如下:


        這個腳本會向IP地址為192.168.1.153的機器的32500端口發送當前Android設備的Clipboard中的文本,文本使用utf-8編碼。
        那么在接收端,需要創建一個UDP節點監聽32500端口的數據,在LabVIEW中使用節點“打開UDP”和“讀取UDP數據”即可。其中“讀取UDP數據”有一個設置超時的參數,將它設為-1即可實現無限等待。看到這里大概群里無聊的文藝程序員又能發現寫情書的新句型:waitYou(timeout=-1)。真是受不了這群人。
        利用While(True)循環,框在“讀取UDP數據”的外面,即可實現一個無止境的監聽過程。到這里基本問題就解決了。但是正如前文所述,沒有想到的,真正麻煩的是字符串的編解碼問題。我插入了一個MATLAB節點,首先的想法是將輸入和輸出設置為字符串類型,在節點內部的MATLAB腳本中使用unicode2native和native2unicode實現解碼,但是發現不好用,因為LabVIEW的中文字符串數據在傳入到MATLAB的過程中就已經損壞了,再怎么解碼也不可能正確解出來。所以我換了一個做法,以數值數組作為MATLAB節點和LabVIEW交互的數據類型,而數值數組里面就是字符串的代碼。一般來說選擇字節數組肯定是沒問題的,但是MATLAB節點的端口沒有字節數組類型,所以只好指定為1D Array of Real。
        在輸入端,我們先使用LabVIEW的“字符串到字節數組”節點,將字符串轉換成字節數組,傳遞給MATLAB節點的輸入端,盡管MATLAB的輸入端是1D Array of Real類型,LabVIEW能夠很好地進行類型轉換。MATLAB腳本利用native2unicode將UTF8字符串轉換成Unicode表示,然后利用unicode2native將Unicode字符串轉換成GBK編碼,這是的數據時uint8數組,然而MATLAB中的uint8數組似乎不能被LabVIEW自動轉換成LabVIEW的double數組,所以我在MATLAB中添加了double()將uint8數組轉成double數組。
        數據離開MATLAB節點后,利用LabVIEW的“字節數組到字符串”節點將數值數組轉換成字符串,并連接到“字符串顯示”控件上。程序就完成了。程序框圖如下圖所示:

        試驗一下UDP數據傳輸和字符串解碼。首先在Android平板中復制一段中文文本:


        復制之后,打開QPython,執行傳輸數據的腳本:


        執行了腳本之后,LabVIEW成功接收到數據,并將數據中的UTF-8字符串解碼,呈現到了“字符串顯示”控件中,如下圖所示:


        大功告成。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 祁连县| 静安区| 内江市| 赤水市| 正宁县| 澄城县| 黑山县| 城固县| 建湖县| 波密县| 湖州市| 仁寿县| 基隆市| 行唐县| 连南| 彰化县| 游戏| 尼勒克县| 专栏| 黄陵县| 普宁市| 桐柏县| 东光县| 隆子县| 祁东县| 都昌县| 那曲县| 成武县| 鹿泉市| 荆门市| 青河县| 象山县| 彭阳县| 芮城县| 远安县| 吉木乃县| 土默特左旗| 内乡县| 钟山县| 那曲县| 蒙自县|