C#-串行端口-数据接收事件-异常行为
本文关键字:异常 事件 串行端口 数据 C#- | 更新日期: 2023-09-27 18:22:08
目前我正忙于使用C#进行串行端口编程,而且对这方面还很陌生。我已经建立了一个控制台应用程序。。。在这个应用程序中,我每200毫秒轮询一次RS 232设备。该设备每次必须用一个字节的响应来响应轮询。
大多数时候,我通过数据接收事件获得预期的字节。但是,有时接收到的数据事件没有启动。。。甚至,我试着在每次轮询后读取可用的字节。。我没有得到预期的字节数。
在花了很多时间没有运气之后,我在运行串口应用程序时意外打开了浏览器。突然,每次轮询的数据接收事件都开始启动。。。浏览器打开后,几秒钟后事件没有再次启动。我试着打开其他一些应用程序,同样的行为仍在继续。在几秒钟内,事件被触发,之后就没有事件了。似乎如果CPU正忙,则接收到的数据事件工作正常。
有人会遇到同样的问题吗?请就如何确保每次触发"数据接收"事件提供建议。谢谢
请在下面找到一个示例代码。
Every 200 ms.
Serial.Parity = System.IO.Ports.Parity.Mark;
Thread.Sleep(2);
Serial.Write(0x01, 0, 1);
Thread.Sleep(1);
Serial.Parity = System.IO.Ports.Parity.Space;
Thread.Sleep(2);`
如果期望传入数据作为参数传递给事件处理程序是非常合理的。不幸的是,DataReceived
事件没有做到这一点,而且通常只是一个愚蠢的设计。
我建议您改为在串行端口的BaseStream
上调用BeginRead
,并提供回调。然后,当事件到达时,您可以将事件和数据汇总在一起。
使用对BeginRead
的链式调用的好处是,如果串行缓冲区包含多条消息,则将获得多个BeginRead
回调。而使用DataReceived
时,您必须检查BytesAvailable
,并计算出缓冲区中有多少消息和部分消息,因为如果不全部读取,事情就会陷入困境。
一般来说,我发现.NET提供的Ports.IO.SerialPort
类是完全无用的,对于我的工作,我使用Win32 API(我自己制作了.NET包装器)。