C# Unity 与COM口设备通信 Part1

  • 前一阵子接到一个甲方脑洞奇大的需求,想用一个类似音响上的音量调整旋钮控制Unity中摄像机的视角,说是控制视角,其实是简单的摄像机围绕一个物体旋转而已。
  • 音量调整旋钮是一个COM口设备,本人并不是嵌入式工程师,COM设备的程序是由其他程序猿完成的,我负责实现Unity与COM口设备的通信
C# Unity 与COM口设备通信 Part1_第1张图片
这货就是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会列出针对上面这些坑的解决思路,供大家参考和讨论

你可能感兴趣的:(C# Unity 与COM口设备通信 Part1)