DataReceived事件有时不会触发

时间:2011-10-18 13:45:13

标签: c# serial-port hardware

我正在使用SerialPort与设备通信。该设备具有RS-485,另一侧(PC)是RS-232(虚拟端口)。设备正常工作,发送和接收数据。

问题是,有时不会触发DataReceived事件。我使用System.Timer将数据发送到设备,每10秒一次。大多数情况下它工作正常,但每隔1-10分钟我就没有得到回复,然后,经过2-4次以后,DataReceived事件最终被触发,我得到了一组数据(我以前“问过”的所有内容)因为在缓冲区中)。

我的问题是:怎么可能

我不能把代码示例放在这里,对不起,但我的应用程序中没有多线程(只有主线程和带有Timer_Elapsed和DataReceived事件的线程,我认为它们是在不同的线程上引发的),我的DataReceived事件处理速度很快,不应并行引发(10秒足够长,设备响应时间低于1秒)。如果我使用Thread.Sleep,那么我确信它不会与任何东西发生冲突。

它可能更多的是硬件而不是软件问题,因为当我使用其他应用程序(其中一个,设备制造商提供的用于测试连接,但没有)测试它时,COM端口以类似的方式运行。看起来好像是用C#编写的。但我对硬件并不是那么好。也许PC有什么问题,或COM端口(它不是内置的,而是外部的)?或者它可以是与操作系统相关的东西(我的应用程序是在Windows Server 2003下运行的Windows服务)。

2 个答案:

答案 0 :(得分:3)

听起来我觉得缓冲区在你预期时没有被刷新。

  

不保证每收到一个字节都会引发DataReceived事件。使用   BytesToRead属性确定在缓冲区中剩余的数据量。

请参阅http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx

(顺便说一句,确实在辅助线程上引发了DataReceived事件。)

您是否尝试过调整ReadBufferSizeReceivedBytesThreshold属性?那是我开始调查的地方。你知道消息的大概吗?您可能希望将ReceivedBytesThreshold属性设置为低于您希望从设备接收的最小消息大小。然后,您可能需要短时间忙于等待最后几个字节来完成消息。

答案 1 :(得分:1)

原来这是一个硬件问题。

设备之间的连接如下所示: 设备<> RS-485<> Converter1<> LAN<> Converter2<> RS-232<计算机<>虚拟COM

Converter1似乎出现故障,它会集中并保存我的设备发送给它的数据。现在我知道出了什么问题我可以让有能力的人来处理它:)

感谢@Matthew Rodatus的帮助。你以迂回的方式回答我的问题,指导我检查究竟是什么以及何时来到我的COM。