- 前一陣子接到一個甲方腦洞奇大的需求,想用一個類似音響上的音量調整旋鈕控制Unity中攝像機的視角,說是控制視角,其實是簡單的攝像機圍繞一個物體旋轉而已。
- 音量調整旋鈕是一個COM口設備,本人并不是嵌入式工程師,COM設備的程序是由其他程序猿完成的,我負責實現Unity與COM口設備的通信
這貨就是COM口設備,黃色圓柱形的東西就是一個角度傳感器,會向PC端發送當前的角度值
- 這里說一下COM設備工程師給出的基本通信方案 和 一些坑
基本通信方案:
1. COM設備連接PC并通電啟動后,是處在等待狀態
2. PC向COM設備發送 byte 類型數據"221",也就是十六進制的"DD" (其實只要發送一個不常用的字符就可以)
3. COM設備接收到正確的指令后,會將當前角度值發送給PC
4. COM設備的數據格式類似于 255 255 171 34 136 42 12 171
5. 前兩位,即使255,255 無實際作用,表示數據開始,用于驗證數據
6. 中間兩位,表示實際數據部分,需要轉換成 Int16才可以使用
7. 中間兩位數據轉換完成后,就是角度值,直接將該值傳入Unity場景中一個物體 rotation的Y值 便可實現旋轉
7. 最后4位,CRC32驗證,驗證前面4位是否正確(該功能未完成)
一些坑:
1. COM設備在嵌入式工程師那邊測試的很順利,只要發送"DD",就可以收到8位的byte數組,但是在PC端用C#控制臺接收卻并不是這樣,可能一次過來 255 255 171,再一次 34 136 42 12,再一次171……所以,8位數據分幾次傳,每次傳多少,全是玄學范疇,說白了就是純隨機,嵌入式工程師也不知道是怎么回事。之后在代碼中會給出解決方案。
2. 在unity中,并沒有控制臺的 SerialDataReceivedEventHandler,所以網上給出的解決方案大多都是在Unity中單開一個線程去處理,或者將監聽COM設備傳回數據的方法放在FixUpdate中。但是,結合坑1中的現象,本來數據傳過來的時候就是隨機分段的,監聽并不是連續的,就很可能造成少接收數據或者數據出錯,經過測試,這種方案出錯概率高的嚇人,基本是無法使用的。
3. Unity中開多個線程有時候會莫名其妙的無響應,要想保證程序運行比較穩定,還是放棄開啟多個線程吧
- Part2會列出針對上面這些坑的解決思路,供大家參考和討論