我正在使用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服务)。
答案 0 :(得分:3)
听起来我觉得缓冲区在你预期时没有被刷新。
不保证每收到一个字节都会引发DataReceived事件。使用 BytesToRead属性确定在缓冲区中剩余的数据量。
请参阅http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx
(顺便说一句,确实在辅助线程上引发了DataReceived事件。)
您是否尝试过调整ReadBufferSize和ReceivedBytesThreshold属性?那是我开始调查的地方。你知道消息的大概吗?您可能希望将ReceivedBytesThreshold属性设置为低于您希望从设备接收的最小消息大小。然后,您可能需要短时间忙于等待最后几个字节来完成消息。
答案 1 :(得分:1)
原来这是一个硬件问题。
设备之间的连接如下所示: 设备<> RS-485<> Converter1<> LAN<> Converter2<> RS-232<计算机<>虚拟COM
Converter1似乎出现故障,它会集中并保存我的设备发送给它的数据。现在我知道出了什么问题我可以让有能力的人来处理它:)
感谢@Matthew Rodatus的帮助。你以迂回的方式回答我的问题,指导我检查究竟是什么以及何时来到我的COM。