C# - 串行端口 - 数据接收事件 - 奇怪的行为

时间:2013-07-13 16:15:04

标签: c# serial-port

目前我忙于使用C#进行串口编程,这对于这些东西来说还是很新的。我已经构建了一个控制台应用程序......在这个应用程序中,我每隔200毫秒轮询一次RS 232设备。设备必须每次响应一个字节响应轮询。

大多数情况下,我通过Data Received事件获得预期的字节。但是,有时数据接收事件不会触发...即使我试图在每次轮询后读取可用字节..我没有得到预期的字节。

花了很多时间没有运气后,我在串口应用运行时意外打开了浏览器。突然,收到的数据事件开始为每个民意调查触发......浏览器开启后,几秒钟之后事件再次没有触发。我尝试打开其他一些应用程序,同样的行为继续。几秒钟后,事件被触发,之后没有事件。看来如果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);`

1 个答案:

答案 0 :(得分:-2)

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

我建议您在串口BeginRead上调用BaseStream,然后提供回调。然后,当您的活动和数据到达时,您就可以将它们放在一起。

使用BeginRead的链式调用的好处是,如果串行缓冲区包含多个消息,您将获得多个BeginRead回调。使用DataReceived时,您必须检查BytesAvailable并确定缓冲区中有多少消息和部分消息,因为如果您不全部读取它们,则会遇到问题。

一般来说,我发现.NET提供的Ports.IO.SerialPort类完全没用,而对于我的工作,我使用的是Win32 API(我自己创建了.NET包装器)。