目前我忙于使用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);`
答案 0 :(得分:-2)
如果将传入数据作为参数传递给事件处理程序是非常合理的。不幸的是,DataReceived
事件不会这样做,而且通常只是一个愚蠢的设计。
我建议您在串口BeginRead
上调用BaseStream
,然后提供回调。然后,当您的活动和数据到达时,您就可以将它们放在一起。
使用BeginRead
的链式调用的好处是,如果串行缓冲区包含多个消息,您将获得多个BeginRead
回调。使用DataReceived
时,您必须检查BytesAvailable
并确定缓冲区中有多少消息和部分消息,因为如果您不全部读取它们,则会遇到问题。
一般来说,我发现.NET提供的Ports.IO.SerialPort
类完全没用,而对于我的工作,我使用的是Win32 API(我自己创建了.NET包装器)。