找回密码
 立即注册
查看: 621|回复: 3

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

[复制链接]
发表于 2021-2-5 10:19 | 显示全部楼层 |阅读模式
    思路有三种,等下我会详细介绍。 后面的博客详细介绍是我收录两年前写的博客,现在我已经没有往串口方向进行开发了,所以只能将一些思路分享给大家。
    解决方式一:将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、打开串口




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




4、读取串口数据




从winform程序中发送数据过去




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




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




Winform接收到的数据




5、解析串口数据










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-2-5 10:23 | 显示全部楼层
你好,我使用SerialPort类来读取串口发来的数据,当串口传输的数据发生改变,如何实时更新unity端收到的数据?这个问题不知该如何解决[捂脸]
发表于 2021-2-5 10:26 | 显示全部楼层
好像unity接收串口数据存在问题,你可以看看我的其他文章,有解决办法的。
发表于 2021-2-5 10:32 | 显示全部楼层
您的公众号搜不到了,是更换了名称吗?
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 20:46 , Processed in 0.093331 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表