tft每日頭條

 > 生活

 > unity串口控制界面

unity串口控制界面

生活 更新时间:2024-09-13 03:05:15

注:以下文章是我收錄兩年前記錄的csDN博客。

一、前言

1、有些人其實會覺得Unity3D用到的.NET是2.0的,其實不然;Unity3D有用到.NET3.5,為什麼說Unity用到的是3.5呢,從一個很常用卻很重要的一個命名空間說起,他就是System.Linq命名空間,這個命名空間是.NET3.5重要的一次改革和核心部分(本命名空間與該文章并沒有什麼很大的聯系,隻是提下而已)。至于為什麼顯示成2.0我也不是很清楚,可能隻支持部分3.5吧,不過對我們來說關系并不是很大。隻要支持Linq就可以了。

2、前提工作:虛拟串口和Unity3D切換成.NET。

2.1 虛拟串口的創建,可以從網上下載一個創建虛拟串口的軟件,比如“VSPD虛拟串口”,還是挺好用的,不過因為我做Unity3D的虛拟串口工作,所以根據VSPD專門寫了一個創建虛拟串口的程序(暫時不提供)。在創建虛拟串口的時候注意一個很重要的問題,就是盡量創建串口号大于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”。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)1

2.3 Unity的目标平台一定要切換為Windows平台,否則是其他平台會報錯誤,本人就是深有體會,針對這個問題找原因找了很久,什麼百度、谷歌、論壇都查閱了,最後還是無意中自己發現解決的了。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)2

切換為Web平台時報的錯誤

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)3

3、Unity的串口與.NET的串口對象參數有些不一樣,比如在Unity3D中打開串口,SerialPort對象的屬性、方法、事件等要比.NET SerialPort對象的屬性、事件、方法要少一些。(圖片不能顯示,所以不就貼圖了,隻是說明下情況),甚至Unity3D的有些屬性還是錯誤的,比如BytesToRead和BytesToWrite兩個屬性都是“未将對象引用值對象的實例”,但是在.NET中這兩個參數默認是為0。這兩個參數用于接收串口發送字節數組時,是很有用處的。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)4

這是WinForm中串口對象裡的屬性

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)5

4、虛拟串口的創建,不像是真實串口線那樣子,它是以對來創建的,比如COM100與COM101一對……至于怎麼成對完全是有那個創建虛拟串口的軟件以及你輸入的串口來決定的。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)6

二、Unity3D内部通信1、内部通信思路

1.1 打開串口

之前在前言中說過,Unity打開串口方式不一樣,因為在.NET2.0打開串口時,如果串口超過10,則必須在前面加上“\\?\”,比如我需要打開COM301,在Unity中你實際傳給串口的參數必須是“”\\?\” “COM301””。

在命名空間中引用System.IO.Ports

創建兩個串口類對象

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)7

1.2 線程接收數據

兩個串口接收數據,并且打印出來,一般接收數據的方法常用的有兩種,一種是接收字符串ReadLine()另一種接收字節Read,稍微我會将接收字節已注釋的形式寫出來。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)8

網關接收數據方法

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)9

協調器接收數據方法

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)10

1.3 發送數據

将這下面兩個方法分别加入到UI Button的事件中,具體如何加這裡就不解釋了。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)11

2、代碼

主要類PortsTest.cs,字節字符串轉化類ClassConvert.cs。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)12

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)13

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)14

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)15

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)16

3、運行結果和異常解析

運行程序後,會提示網關串口打開成功和協調器串口打開成功。

3.1、當以字符串形式發送串口數據和接收串口數據時,會發現一個問題就是在接收串口數據時,會出現數據丢失的情況,網關串口向協調器發送”FF0000”時,協調器接收數據偶爾會接收到“F0000”甚至是為空,隻有當連續發送兩次時,才會成功。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)17

3.2、當以字節發送和接收串口數據時,會出現一條完整的數據會以兩次打印出來。比如将“new byte[] { 0xFF, 0x00, 0x01 }”發送過去,然後打印出來的結果是第一條是FF 第二條是00 01等等情況,感覺像是随機的。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)18

4、當以字節發送,字符串形式接收時,是無法接收數據的

以上問題目前我也不知道是什麼情況,解決思路是怎樣的,發生該問題的原因可能是因為Unity對串口這塊本身支持就不是很大,畢竟不是專門針對Windows平台的。

三、Unity3D與Winform程序之間的串口通信

在第一部分中介紹了Unity3D内部間的通信,現在測試Unity3D與Winform程序之間的串口通信。

首先Unity3D串口程序跟第一節類似的,隻不過把網關打開串口那一部分代碼移植到Winform中,然後修改一下打開串口的方式即可。

1、打開串口方式

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)19

以上就是核心代碼。

2、打開串口方式

發送字符串和接收字符串遇到以下發生過的問題

2.1 winform程序發送數據成功了,但是Unity接收不到

2.2 Unity往Winform程序總發送數據時,是沒有問題的。而Unity卻接收不到。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)20

發送字節和接收字節遇到以下發生過的問題

2.3 WinForm程序發送數據成功了,但是Unity接收到的數據存在問題,數據不符或數據中斷,要想解決這個問題有兩種方法:

第一可能是Unity官方的錯誤,如果能做成跟.NET串口通信一緻的話,那麼這個問題很好解決。不過這個問題不夠現實,因為Unity本身就是為遊戲而開發的。

第二那就自己去解決了,看到Unity接收到的數據存在數據不符,還有數據斷層,隻能根據自身的要求,然後去測試,添加校驗位,根據首校驗位和末校驗位來截取你想要的字節。隻有這樣子你才可能接收到正常的串口數據。但是這樣子也存在很多的局限性!!!

2.4 Unity往WinForm程序中發送的數據時,是沒有問題的。

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)21

unity串口控制界面(Unity3D内部串口通信與Winform的實現和異常問題)22

有問題可關注我的公衆号(Hua灬清),我會每周推送一篇原創技術博客。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved