为什么Unity中串口无法正常工作?

4

我需要帮助,非常着急

我已经在我的项目中工作了两周,它使用串口通信 (一个 PIC 串行板)。我已经建立了连接,但是无法从 COM 端口获取数据。我查阅了一些论坛,问题的原因似乎是 System.IO.Ports class 的不完整实现。

当我尝试获取 COM 端口的数据时,事件 SerialDataReceivedEventHandler (表示将处理 SerialPort 对象的 DataReceived 事件的方法)未被调用或激活。我尝试解决它,但是没有找到明确的解决方案。我想尝试使用外部 DLL,但是一位朋友告诉我,问题仍然存在,事实上我尝试过并且遇到了相同的问题: SerialDataReceivedEventHandler 无法正常工作。还有人推荐我使用二级线程,虽然我完全不知道如何做。

我用 Visual C# 编写了一个程序,一切正常。我很好奇。

我需要找到一个解决方案、一些想法或者好的文档资料。如果有人对此有所了解,请帮帮我。

我需要理解这个问题的原因才能继续。


请不要将关于Unity游戏引擎的问题标记为“unity”标签。在使用标签之前,通常最好阅读标签的描述。 - Max Yankov
我遇到了一个问题,在Unity论坛上读到,问题是因为Unity使用的是Mono 2.0,所以串行数据事件没有正确实现,这就是为什么事件不会触发方法的原因。你需要每隔X时间检查一次值,或者自己制作dll来实现这个功能,但这更加困难。 - Darkmax
2个回答

3
Unity基于Mono,而Mono没有完全实现Serial类,特别是没有实现通知(如SerialDataReceivedEvent)。
这就是为什么它在Visual Studio中工作而在Unity中不工作的原因。
以下是Mono和完整.NET实现的Serial类之间的区别:
摘自http://www.mono-project.com/archived/howtosystemioports/#limitations “限制 在撰写本文时,有一些限制必须注意:
1)没有接收串行数据的事件通知。如果想要接收数据,必须设置超时并在认为可能有数据时通过轮询ReadByte()来监视接收到的数据。
2)只能以byte[]格式读取数据-没有char[]支持。必须自己读取字节并将其转换为所需编码。
3)DiscardNull、ParityReplace、ReceivedBytesThreshold未实现。”

我上面的回答已经有7年了,最新版本的Mono似乎支持System.IO.Ports.SerialPort.DataReceived事件(请参见http://docs.go-mono.com/?link=E%3aSystem.IO.Ports.SerialPort.DataReceived)。但是我不确定Unity当前使用的是哪个版本的Mono。 - Ben

1
我认为这是因为Unity基于Mono而不是.Net,而且是一个相当旧的版本。由于AOT错误,你长时间无法在iOS设备上使用Linq,并且本地化实现存在缺陷(或者至少在我尝试使用的以前版本中存在)。我甚至无法找到Unity Mono分支源代码中System.IO.Ports的源头,所以它能编译通过令人惊讶。

SerialPort在Mono中实现,甚至在Unity的Mono分支中也有,详情请见:https://github.com/Unity-Technologies/mono/blob/unity-staging/mcs/class/System/System.IO.Ports/SerialPort.cs 但是有一些限制,特别是没有实现事件,详见:http://www.mono-project.com/archived/howtosystemioports/#limitations - Ben
更新一下,Unity的Mono分支现在没有实现System.IO.Ports。https://github.com/Unity-Technologies/mono - Ted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接