注:以下文章是我收錄兩年前記錄的CSDN博客。
一、前言
1、有些人其實會覺得Unity3D用到的.NET是2.0的,其實不然;Unity3D有用到.NET3.5,為什么說Unity用到的是3.5呢,從一個很常用卻很重要的一個命名空間說起,他就是System.Linq命名空間,這個命名空間是.NET3.5重要的一次改革和核心部分(本命名空間與該文章并沒有什么很大的聯(lián)系,只是提下而已)。至于為什么顯示成2.0我也不是很清楚,可能只支持部分3.5吧,不過對我們來說關系并不是很大。只要支持Linq就可以了。
2、前提工作:虛擬串口和Unity3D切換成.NET。
2.1 虛擬串口的創(chuàng)建,可以從網(wǎng)上下載一個創(chuàng)建虛擬串口的軟件,比如“VSPD虛擬串口”,還是挺好用的,不過因為我做Unity3D的虛擬串口工作,所以根據(jù)VSPD專門寫了一個創(chuàng)建虛擬串口的程序(暫時不提供)。在創(chuàng)建虛擬串口的時候注意一個很重要的問題,就是盡量創(chuàng)建串口號大于10的,比如COM10、COM11甚至夸張點COM100等,為什么要這樣子,后面我會介紹Unity3D打開串口時,串口號大于10時,打開串口方式與.NET打開串口的方式是不一樣的。
2.2 將Unity3D的API平臺切換成.NET2.0。如何切換“Edit–project Setting–Player–Other Setting –Api Compatibility level”。在這里將“.NET2.0 Subset”切換為“.NET2.0”。
2.3 Unity的目標平臺一定要切換為Windows平臺,否則是其他平臺會報錯誤,本人就是深有體會,針對這個問題找原因找了很久,什么百度、谷歌、論壇都查閱了,最后還是無意中自己發(fā)現(xiàn)解決的了。
切換為Web平臺時報的錯誤
3、Unity的串口與.NET的串口對象參數(shù)有些不一樣,比如在Unity3D中打開串口,SerialPort對象的屬性、方法、事件等要比.NET SerialPort對象的屬性、事件、方法要少一些。(圖片不能顯示,所以不就貼圖了,只是說明下情況),甚至Unity3D的有些屬性還是錯誤的,比如BytesToRead和BytesToWrite兩個屬性都是“未將對象引用值對象的實例”,但是在.NET中這兩個參數(shù)默認是為0。這兩個參數(shù)用于接收串口發(fā)送字節(jié)數(shù)組時,是很有用處的。
這是WinForm中串口對象里的屬性
4、虛擬串口的創(chuàng)建,不像是真實串口線那樣子,它是以對來創(chuàng)建的,比如COM100與COM101一對……至于怎么成對完全是有那個創(chuàng)建虛擬串口的軟件以及你輸入的串口來決定的。
二、Unity3D內(nèi)部通信1、內(nèi)部通信思路
1.1 打開串口
之前在前言中說過,Unity打開串口方式不一樣,因為在.NET2.0打開串口時,如果串口超過10,則必須在前面加上“\?\”,比如我需要打開COM301,在Unity中你實際傳給串口的參數(shù)必須是“”\?\” + “COM301””。
在命名空間中引用System.IO.Ports
創(chuàng)建兩個串口類對象
1.2 線程接收數(shù)據(jù)
兩個串口接收數(shù)據(jù),并且打印出來,一般接收數(shù)據(jù)的方法常用的有兩種,一種是接收字符串ReadLine()另一種接收字節(jié)Read,稍微我會將接收字節(jié)已注釋的形式寫出來。
網(wǎng)關接收數(shù)據(jù)方法
協(xié)調(diào)器接收數(shù)據(jù)方法
1.3 發(fā)送數(shù)據(jù)
將這下面兩個方法分別加入到UI Button的事件中,具體如何加這里就不解釋了。
2、代碼
主要類PortsTest.cs,字節(jié)字符串轉化類ClassConvert.cs。
3、運行結果和異常解析
運行程序后,會提示網(wǎng)關串口打開成功和協(xié)調(diào)器串口打開成功。
3.1、當以字符串形式發(fā)送串口數(shù)據(jù)和接收串口數(shù)據(jù)時,會發(fā)現(xiàn)一個問題就是在接收串口數(shù)據(jù)時,會出現(xiàn)數(shù)據(jù)丟失的情況,網(wǎng)關串口向協(xié)調(diào)器發(fā)送”FF0000”時,協(xié)調(diào)器接收數(shù)據(jù)偶爾會接收到“F0000”甚至是為空,只有當連續(xù)發(fā)送兩次時,才會成功。
3.2、當以字節(jié)發(fā)送和接收串口數(shù)據(jù)時,會出現(xiàn)一條完整的數(shù)據(jù)會以兩次打印出來。比如將“new byte[] { 0xFF, 0x00, 0x01 }”發(fā)送過去,然后打印出來的結果是第一條是FF 第二條是00 01等等情況,感覺像是隨機的。
4、當以字節(jié)發(fā)送,字符串形式接收時,是無法接收數(shù)據(jù)的
以上問題目前我也不知道是什么情況,解決思路是怎樣的,發(fā)生該問題的原因可能是因為Unity對串口這塊本身支持就不是很大,畢竟不是專門針對Windows平臺的。
三、Unity3D與Winform程序之間的串口通信
在第一部分中介紹了Unity3D內(nèi)部間的通信,現(xiàn)在測試Unity3D與Winform程序之間的串口通信。
首先Unity3D串口程序跟第一節(jié)類似的,只不過把網(wǎng)關打開串口那一部分代碼移植到Winform中,然后修改一下打開串口的方式即可。
1、打開串口方式
以上就是核心代碼。
2、打開串口方式
發(fā)送字符串和接收字符串遇到以下發(fā)生過的問題
2.1 winform程序發(fā)送數(shù)據(jù)成功了,但是Unity接收不到
2.2 Unity往Winform程序總發(fā)送數(shù)據(jù)時,是沒有問題的。而Unity卻接收不到。
發(fā)送字節(jié)和接收字節(jié)遇到以下發(fā)生過的問題
2.3 WinForm程序發(fā)送數(shù)據(jù)成功了,但是Unity接收到的數(shù)據(jù)存在問題,數(shù)據(jù)不符或數(shù)據(jù)中斷,要想解決這個問題有兩種方法:
第一可能是Unity官方的錯誤,如果能做成跟.NET串口通信一致的話,那么這個問題很好解決。不過這個問題不夠現(xiàn)實,因為Unity本身就是為游戲而開發(fā)的。
第二那就自己去解決了,看到Unity接收到的數(shù)據(jù)存在數(shù)據(jù)不符,還有數(shù)據(jù)斷層,只能根據(jù)自身的要求,然后去測試,添加校驗位,根據(jù)首校驗位和末校驗位來截取你想要的字節(jié)。只有這樣子你才可能接收到正常的串口數(shù)據(jù)。但是這樣子也存在很多的局限性!!!
2.4 Unity往WinForm程序中發(fā)送的數(shù)據(jù)時,是沒有問題的。
有問題可關注我的公眾號(Hua灬清),我會每周推送一篇原創(chuàng)技術博客。
NP301就像職場老實人,簡單、穩(wěn)定、通用、省心,哪里有需要往哪里裝。這款能讓串口設備即刻連網(wǎng)的串口服務器,在三旺龐雜的產(chǎn)品體系中并不打眼,但用過NP301的工業(yè)項目卻不勝枚舉,這是為什么呢?
先看簡簡單單的視頻
<script src="https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>
從視頻中我們能直觀了解,關于NP301的尺寸、外殼材質、端口布局等信息,而這些外在的硬件配置,在布線施工時能夠起到什么作用呢?
硬件上來說,它可以幫你完美的做到以下4點:
1.小巧低耗省空間,安裝簡單。
體積半個巴掌大,節(jié)約空間
多種安裝方式,導軌、壁掛、桌面多種選擇
配置簡單,WEB界面友好
低功耗運行,滿載0.84W,空載0.80W
2.環(huán)境再惡劣,也能穩(wěn)定運行。
金屬外殼,抗振抗沖擊
IP40防護等級,有效防止灰塵顆粒
工業(yè)級EMC防護,有效防止雷電、浪涌、脈沖等產(chǎn)生的影響
3.一機三口,老舊串口設備都能通用。
NP301有RS232/422/485可選,幾乎可滿足工業(yè)布線中所有串口設備的連接。
4.寬溫寬壓無阻塞,使用放寬心。
支持-40~75℃寬溫運行,北到黑龍江極寒天氣,南到海南高濕環(huán)境,都可穩(wěn)定運行
支持9~48VDC寬壓輸入,適應大多數(shù)工業(yè)電壓供應環(huán)境
支持300bps~115200bps線速無阻塞通信
NP301
在工業(yè)項目中,對于串口服務器的要求肯定不止于硬件,在軟性能方面,往往會提出更嚴苛的要求,像NP301這種簡單的串口服務器,在軟性能方面是否滿足工業(yè)嚴苛要求,能否完美解決讓串口設備即刻連網(wǎng)的問題,尤其重要。
那老實人NP301在軟性方面到底有哪些技術優(yōu)勢,又能夠為你解決哪些設備連網(wǎng)問題呢?
總結來說,它主要能解決以下5個大點:
1.輕松滿足各種使用和管理需求
豐富的工作模式:RealCom、TCP Server、TCP Client、UDP Server、UDP Client、UDP Multicast、UDP Rang、Pair Slave、Pair Master,輕松應對客戶的各種使用需求。
支持WEB、命令行 、SNMP等多種配置方式,滿足各種管理需求
2.三“多”技術,設備聯(lián)網(wǎng)不操心
支持多主機輪詢模式,實現(xiàn)多個主機訪問同一個串口
支持定界符匹配通信,實現(xiàn)多樣化的串口打包需求
支持FIFO功能,兼容各種舊式終端設備
不起眼
3.分權限訪問,網(wǎng)絡安全可控
支持IP地址和MAC地址過濾功能,輕松實現(xiàn)精確的訪問控制
支持用戶分級管理,實現(xiàn)差異化權限分配
4.通信穩(wěn)定可靠,數(shù)據(jù)不丟失
支持串口狀態(tài)和串口參數(shù)監(jiān)視,通信狀態(tài)一目了然
提供網(wǎng)絡中斷自動恢復連接功能,保證通信數(shù)據(jù)不丟失
5.在線升級,后期維護簡便
提供Windows多系列虛擬串口驅動程序,方便實現(xiàn)串口到網(wǎng)絡的平滑升級
WEB界面支持在線固件升級
NP301硬件配置和軟件性能都不錯,那我們要不要選擇這款產(chǎn)品呢?實際上,串口服務器成千上萬,它們在功能上只有一點要求,那就是讓串口設備連接網(wǎng)絡。
對于整個工業(yè)項目來說,串口服務器只是一個小而必要的東西,所以選擇上,我們應該從硬件和軟件兩個方面綜合考量,畢竟誰也不想因為一個小小的鏈接環(huán)節(jié),出現(xiàn)個小問題,而投入大量的人力物力。所以,各位大佬,怎么看待這款串口服務器呢?
碼字不易,求贊求轉發(fā)。