基于Unity串口通信的解决方案

    两年来陆陆续续有朋友加我QQ或发邮件,讨论串口相关的问题,最终解决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、定义存储串口数据变量

2、打开串口

基于Unity串口通信的解决方案_第1张图片

3、打印串口数据

这个打印串口数据是一个方法,就是在Unity中打印接收到的串口数据,怕读者看代码是有点不懂这方法是干嘛的,所以我贴出来。

基于Unity串口通信的解决方案_第2张图片

4、读取串口数据

基于Unity串口通信的解决方案_第3张图片

从winform程序中发送数据过去

Unity接收到的数据情况,发送数据经过我们组合后是没有问题的。

基于Unity串口通信的解决方案_第4张图片

但是当我Unity中发送给上位机数据时,突然unity串口中接收到一个00数据,该测试不是从我写的测试程序测试的,而是从实际项目中测试的,但是我在自己写的测试程序中又没有这个问题。针对此结果加上一些数据规律,我后期自己进行了改动(后面会详细介绍)。

经过解析数据,然后返回给Winform数据,返回后突然又接到异常数据。

基于Unity串口通信的解决方案_第5张图片

Winform接收到的数据

5、解析串口数据

基于Unity串口通信的解决方案_第6张图片
基于Unity串口通信的解决方案_第7张图片
基于Unity串口通信的解决方案_第8张图片

六、总结

1、上述可能会让一些读者觉得有比较多的漏洞,我后续如果发现更好的解决方案和问题,也会陆续更新。一方面是记录下曾经问题方便以后,另一方面也是让Unity开发串口这边的开发者一个思路和想法吧。因为我深感此处的坑。

2、如果有读者看到了,有一些好的解决方案、帮助等都可以联系我,我们共同探讨。关注我的公众号(Hua灬清),每周推送原创技术博客。

基于Unity串口通信的解决方案_第9张图片
Hua灬清

你可能感兴趣的:(基于Unity串口通信的解决方案)