我開發過三個專案採用收發字串(unity接收字串,傳送字串)、收發單個位元組(unity接收單位元組,傳送位元組陣列)、收發位元組陣列。三個專案都是unity通過串列埠與winform程式(或wpf程式)進行串列埠通訊。
結合我實際專案,來講解!以專案三方式為例。
在專案三中說過,unity中接收單個位元組,並且進行組裝,在解析。
1、定義儲存串列埠資料變數
[nonserialized]
private list listreceive = new list();
//定義乙個泛型,暫時儲存接收到的串列埠資料。這個泛型的特性不用理會。
2、開啟串列埠
public
bool
openport(string portname)
catch (exception err)
}else
} /*
**解釋:
1)在串口號前加"\\\\?\\"是因為我的串口號大於10了,這是因為我採用的是虛擬串口號,為什麼要加這個是因為.net2.0的原因,詳細的可看(
2)**中有個執行緒,執行緒有個方法portreceive()該方法是讀取串列埠資料的
*/
3、列印串列埠資料
這個列印串列埠資料是乙個方法,就是在unity中列印接收到的串列埠資料,怕讀者看**是有點不懂這方法是幹嘛的,所以我貼出來。
void printdata()
unityengine.debug.log("協調器列印:" + str+" 位元組長度:"+listreceive.count);
}
4、讀取串列埠資料
private
void
portreceive()
//messageaddreceive(addr.tostring("x2"));
if(eventportread != null) );}}
catch
}} /*
解析:1)byte addr = convert.tobyte(port.readbyte());從串列埠中接收單個位元組,然後轉化為byte型別的,預設是int型別的。
2)this.port.discardinbuffer();清除串列埠快取資料,不過暫時我沒發現這個方法有什麼很明顯的使用者。不過先寫著吧。
3)listreceive.add(addr);新增到泛型中
4)printdata();列印接收到的資料
5)在這裡catch下面的**最好為空,因為我們是用執行緒來接收串列埠資料,當unity沒有接收到資料時,就會報異常,所以我們需要在catch下不要寫**,本來是有個屬性可以用的,不過在unity中存在問題,詳細的可看我第一篇文章。
6)其他的就不用理會了,那是我後期的一些處理,跟我們所講沒關係,之所以全部展示出來也是在實際專案中的一些處理。
*/
從winform程式中傳送資料過去
unity接收到的資料情況,傳送資料經過我們組合後是沒有問題的。
但是當我unity中傳送給上位機資料時,突然unity串列埠中接收到乙個00資料,該測試不是從我寫的測試程式測試的,而是從實際專案中測試的,但是我在自己寫的測試程式中又沒有這個問題。針對此結果加上一些資料規律,我後期自己進行了改動(後面會詳細介紹)。
經過解析資料,然後返回給winform資料,返回後突然又接到異常資料。
winform接收到的資料
5、解析串列埠資料
private
void
parsereceive()
listreceive.removerange(0, 9);
"解析接收後******************");
//printdata();
"****************************");
try ;
tsetdata.start(o);}}
catch
}else
if(listreceive[0] == 0x00 && listreceive[8] == 0x5a)
else
}listreceive.removerange(0, count);}}
}}} /*
解析:1)這是我對首尾標記的檢測,從而擷取到我想要的資料,這個解析一般是應自身專案需求。
//if(listreceive[0] == 0xa5 && listreceive[8] == 0x5a)
2)擷取到我想要的資料,從而轉化為字串。並且從泛型中將這些資料移除掉。
string temp = string.empty;for(int i = 0; i < 9; i++)
listreceive.removerange(0, 9);
3)然後解析我得到的資料,從而通過串列埠傳送給winform,這裡應自身專案需求,所以可不理會。
try ;
tsetdata.start(o);
}}catch
4)之所以做這個處理原因是當我給winform程式傳送資料時,突然會接收到異常資料0x00,但是我的winform沒有回資料,所以這資料怎麼來的我也不清楚,後期我會在研究下是我的**問題還是其他原因,不過這是我的乙個處理,所以也不需要理會。
else if(listreceive[0] == 0x00 && listreceive[8] == 0x5a)
5)、當資料異常時,把異常資料處理掉,保證資料的正常。
else
}listreceive.removerange(0, count);
}6)從3),4),5)開始都是我對接收到的串列埠資料一些處理,從而來保證接收資料正常,這也是實際專案中需要幹的事情,可能在測試中不需要。
*/
6、總結
1、上述可能會讓一些讀者覺得有比較多的漏洞,我後續如果發現更好的解決方案和問題,也會陸續更新。一方面是記錄下曾經問題方便以後,另一方面也是讓unity開發串列埠這邊的開發者乙個思路和想法吧。因為我深感此處的坑。
2、如果有讀者看到了,有一些好的解決方案、幫助等都可以聯絡我,我們共同**。我平時不看自己的部落格,所以有需要詳細的我可以發郵件給我([email protected])。
Unity串列埠通訊
unity技術qq群 484275915,有需要可以 相互 用unity串列埠程式設計很長時間了,一直輕信網上的觀點,以為unity不支援com10以上的串列埠,根本跟unity沒有關係好嘛?所以千萬別輕信網上人說的什麼不支援這不支援那,多研究,多研究,多研究。重要的事情說三遍。吐槽完我們來好好聊一...
基於ARM CPLD的多串列埠通訊協議轉換方案
多串列埠通訊協議轉換方案 應用背景 隨著網路經濟時代的到來,基於tcp ip協議的ip網的應用得到廣泛普及,利用網路資源可以實現裝置的網路接入,裝置聯網監控已經成為工業自動化的發展趨勢。恆頤多串列埠協議轉換方案可以實現將工業現場的傳統串列埠裝置接入ip網路,實現多個不同協議的串列埠裝置與乙太網進行雙...
基於FPGA的UART串列埠通訊
通過串列埠除錯助手pc傳送16bit給fpga,fpga接收後返還給pc。串列埠通訊其實沒我們想象中的那麼難,只要花點時間去理解,很快就會上手,在直入正題前,先來一點基礎知識。串列埠是指傳送和接收資料的序列口,就是我們開啟電腦裝置管理器後看到的com口。fpga或微控制器的板子中很多都用到的是uar...