-1

目前我正忙于使用 C# 进行串行端口编程,并且对这些东西非常陌生。我已经构建了一个控制台应用程序......在这个应用程序中,我每 200 毫秒轮询一次 RS 232 设备。设备每次必须以一个字节响应来响应轮询。

大多数时候,我通过数据接收事件得到预期的字节。但是,有时接收到的数据事件没有触发......甚至,我尝试在每次轮询后读取可用字节......我没有得到预期的字节。

在花了很多时间没有运气之后,我在串口应用程序运行时不小心打开了浏览器。突然,每次轮询的数据接收事件开始触发......打开浏览器后,几秒钟后该事件没有再次触发。我尝试打开其他一些应用程序,同样的行为仍在继续。几秒钟后,事件被触发,之后没有事件。似乎如果 CPU 很忙,则接收到的数据事件工作正常。

有人可以遇到同样的问题吗?请就如何确保每次都触发 Data Received 事件提出建议。谢谢!

请在下面找到示例代码。

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);`
4

1 回答 1

-2

如果期望传入数据作为参数传递给事件处理程序是非常合理的。不幸的是,DataReceived事件并没有这样做,而且通常只是一个愚蠢的设计。

我建议你改为调用BeginRead串口BaseStream,并提供回调。然后,当事件到达时,您将事件和数据放在一起。

使用链式调用的一个好处BeginRead是,如果串行缓冲区包含多条消息,您将获得多个BeginRead回调。虽然DataReceived您必须检查BytesAvailable并确定缓冲区中有多少消息和部分消息,因为如果您不全部阅读它们,事情就会卡住。

一般来说,我发现Ports.IO.SerialPort.NET 提供的类完全没用,我在工作中改用 Win32 API(我制作了自己的 .NET 包装器)。

于 2013-07-13T16:23:14.377 回答