天天看點

simulink接收序列槽資料_基于Unity序列槽通信的解決方案

思路有三種,等下我會詳細介紹。 後面的部落格詳細介紹是我收錄兩年前寫的部落格,現在我已經沒有往序列槽方向進行開發了,是以隻能将一些思路分享給大家。

​ ​

解決方式一:将Unity序列槽通信資料子產品(接收與發送),用C++來實作,這是最佳最好的解決方式。(最佳) ​解決方式二:用一個中間介程式去實作,Unity序列槽通信子產品通過Socket發送給中介程式,中介程式在通過序列槽将資訊發送到其他地方去。(其次) ​解決方式三:Unity接收序列槽資料,進行臨時存儲,然後解析,進而分析出正确的序列槽資料。(不穩定,局限性很高,需要實時接收序列槽資料,并且還要進行解析,防止資料接收錯誤)

注:以下文章是我收錄兩年前記錄的CSDN部落格。

一、簡介

1、我釋出過一篇關于Unity的序列槽通信問題,隻是闡述了問題,但是沒有什麼好的解決方案。經過我幾個對序列槽相關的Unity項目開發,也發現了幾種解決方案。開發中遇到的一些問題都詳細的描述出來。

2、在上一篇文章我曾提過Unity因為采用的是Mono .NET 2.0。這個版本對COM支援不是很好,是以導緻Unity在序列槽通信方面有些問題。不過最近釋出了Mono .NET4.6版本的Unity 5.5測試版,該問題可能會解決掉,不過可能需要等到2017年了。

3、言歸正傳,我們首先要知道C#接收序列槽的主要幾種方式:接收位元組byte,接收位元組資料byte[],接收字元串string。在Unity中往序列槽中發送資料是為沒有問題的,主要是接收資料會存在問題,下面圖檔我總結了一下,這結果是我經過不下于100次測試而來的,可能每個人的測試結果都不一樣或我的測試還有一些局限。

還有其他的序列槽讀取方法,但是我就沒有測試了,因為我實際項目中就需要這幾種,是以其他的我就不好意思說。

二、Unity與Winform(WPF)序列槽通信的幾種解決方案

我開發過三個項目采用收發字元串(Unity接收字元串,發送字元串)、收發單個位元組(Unity接收單位元組,發送位元組數組)、收發位元組數組。三個項目都是Unity通過序列槽與Winform程式(或WPF程式)進行序列槽通信。

項目一

​1、該項目有兩種序列槽接收方式,一種是收發字元串(Unity接收字元串,發送字元串),另一個是收單個位元組,然後對每個位元組進行組裝解析,在發送位元組數組。

​2、經過項目的開發和測試,我發現收發字元串是沒有問題的,但是在我自己寫的測試程式中卻出現異常,出現資料錯誤,資料丢失以及接收不到資料等随機性錯誤(第一篇關于序列槽文章)。不過經過我發現實際項目中的序列槽收發格式是有标記位和校驗位,但是當我自己寫程式去測試時,卻發現了異常。針對這個問題我到時候後期會在進行仔細研究下,因為我現在也沒找到合适的理由去說服自己以及讀者,是以我不會去做詳細的介紹隻是提醒讀者,後期如果解決了我會在部落格上寫出來。

項目二

​1、該項目是接收字元串數組和發送字元串數組,在實際開發項目中卻出現了Unity接收資料錯誤的問題,針對該問題加上項目時間緊急,不可在此問題耗費我太大心力,是以無意中想到用中間件程式來做Unity與winform程式通信的一個橋梁。

​2、我寫一個中間件程式,讓Winform程式與我的中間件程式進行序列槽通信,中間件程式與Unity程式Socket通信。

​3、首先啟動我的中間件程式,然後中間件程式啟動我的Unity程式。中間件程式隐藏起來并與Unity程式互相監聽,當Unity程式關閉時,中間件程式也關閉。這樣從表面上看起來就隻是Unity一個程式在工作,實際上中間還有一個中間件程式在做幕後工作。進而巧妙的完成了所謂的Unity與Winform程式之間的序列槽通信。但是這終究不是一個很好的解決方案。

項目三

​1、這個項目三就是我們的重頭戲了,這也是我最新研究的一種解決方案,而且經過測試和實際項目開發,也是沒什麼很大問題的,不過有個項目會有一些小問題,但是被我很簡單的解決掉了。後面我都會詳細的講解這個解決方案,如果有朋友與我闡述的不符,那麼可以參考項目二的解決方案給您一點小思路。

​2、該項目采用的是什麼呢,首先Winform程式往Unity中發送位元組數組,從Unity中讀取位元組數組資料。按照正常的邏輯上我們的Unity也應該從序列槽中讀取位元組數組和發送位元組數組。但是在這一塊出現了問題,上面圖檔我闡述過,Unity從序列槽接收位元組數組時會出現需要兩次才能接收完,第一次接收一個位元組第二次接收剩下的。資料倒不會出現異常,但是這對我們的資料處理顯然是不好的。針對此問題,我下面一大章節來結合實際項目來解釋。

三、Unity解析序列槽資料,得到完整資料

1、定義存儲序列槽資料變量
simulink接收序列槽資料_基于Unity序列槽通信的解決方案
2、打開序列槽
simulink接收序列槽資料_基于Unity序列槽通信的解決方案
3、列印序列槽資料

這個列印序列槽資料是一個方法,就是在Unity中列印接收到的序列槽資料,怕讀者看代碼是有點不懂這方法是幹嘛的,是以我貼出來。

simulink接收序列槽資料_基于Unity序列槽通信的解決方案
4、讀取序列槽資料
simulink接收序列槽資料_基于Unity序列槽通信的解決方案

從winform程式中發送資料過去

simulink接收序列槽資料_基于Unity序列槽通信的解決方案

Unity接收到的資料情況,發送資料經過我們組合後是沒有問題的。

simulink接收序列槽資料_基于Unity序列槽通信的解決方案

但是當我Unity中發送給上位機資料時,突然unity序列槽中接收到一個00資料,該測試不是從我寫的測試程式測試的,而是從實際項目中測試的,但是我在自己寫的測試程式中又沒有這個問題。針對此結果加上一些資料規律,我後期自己進行了改動(後面會詳細介紹)。

經過解析資料,然後傳回給Winform資料,傳回後突然又接到異常資料。

simulink接收序列槽資料_基于Unity序列槽通信的解決方案

Winform接收到的資料

simulink接收序列槽資料_基于Unity序列槽通信的解決方案
5、解析序列槽資料
simulink接收序列槽資料_基于Unity序列槽通信的解決方案
simulink接收序列槽資料_基于Unity序列槽通信的解決方案
simulink接收序列槽資料_基于Unity序列槽通信的解決方案

繼續閱讀