DataReceived事件有时不触发
本文关键字:事件 DataReceived | 更新日期: 2023-09-27 18:11:40
我正在使用SerialPort与设备通信。设备有RS-485,另一边(PC)是RS-232(虚拟端口)。设备工作,发送和接收数据正确。
问题是,DataReceived事件有时没有被触发。我使用系统将数据发送到设备。计时器,每10秒一次。大多数时候它工作得很好,但是每隔1-10分钟我没有得到响应,然后,经过2-4次DataReceived事件最终被触发,我得到一个数据集群(我以前"要求"的所有内容都在缓冲区中)。
我的问题是:这怎么可能?
我不能把代码示例放在这里,我很抱歉,但在我的应用程序中没有多线程(只有主线程和线程与Timer_Elapsed和DataReceived事件,我认为它们是在单独的线程上提出的),我的DataReceived事件处理得很快,不应该并行提出(10秒足够长,设备响应时间低于1秒)。如果我使用Thread。睡觉的地方,我确信它不会与任何东西发生冲突。
这可能更多的是硬件问题,而不是软件问题,因为当我使用其他应用程序(其中一个,设备制造商提供测试连接,看起来不像是用c#编写的)测试它时,COM端口以类似的方式运行。但我对硬件不太在行。也许有什么问题与PC,或COM端口(它不是内置的,但外部)?或者是操作系统相关的事情(我的应用程序是在Windows Server 2003下运行的Windows服务)
听起来好像缓冲区没有在您期望的时候被刷新。
不能保证为接收到的每个字节引发DataReceived事件。使用BytesToRead属性来确定缓冲区中还有多少数据需要读取。
见http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx
(顺便说一句,DataReceived事件确实在次要线程上引发。)
你试过调整ReadBufferSize和ReceivedBytesThreshold属性吗?这就是我开始调查的地方。你知道这些信息的大致大小吗?您可能希望将ReceivedBytesThreshold属性设置为略低于期望从设备接收的最小消息大小。然后,您可能需要一段短时间的忙碌等待,以获得最后几个字节来完成消息。
原来是硬件问题。
设备之间的连接是这样的:Device <> RS-485 <> Converter1 <> LAN <> Converter2 <> RS-232 <> Computer <> virtual COM
Converter1出现故障,它聚集并保存我的设备发送给它的数据。现在我知道是什么问题了,我可以让有能力的人来处理:)
感谢matthew Rodatus的帮助。你的回答迂回地引导我去检查到底是什么,什么时候到达我的COM。