我正在与使用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 2003下的Windows服务)。
发布于 2011-10-19 08:44:12
原来是硬件问题。
设备之间的连接如下:设备<> RS-485 <> Converter1 <> Converter2 <> RS-232 <> Computer <>虚拟COM
Converter1似乎出现故障,它聚集并保存我的设备发送给它的数据。现在我知道出了什么问题,我可以让有能力的人来处理它:)
谢谢你的帮助。你的回答以迂回的方式引导我去检查到底是什么,什么时候来我的网站。
发布于 2011-10-18 13:54:45
在我看来,当你期待的时候,缓冲器就不会被冲红。
对于接收到的每个字节,都不能保证引发DataReceived事件。使用BytesToRead属性确定缓冲区中要读取的数据数量。
请参阅http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx
(顺便说一句,DataReceived事件确实是在次要线程上引发的。)
您是否尝试过调整ReadBufferSize和ReceivedBytesThreshold属性?那就是我开始调查的地方。你知道这些信息的大致大小吗?您可能希望将ReceivedBytesThreshold属性设置为您希望从设备接收的最小消息大小。然后,您可能需要一小段时间的忙碌等待,以获得最后几个字节来完成消息。
https://stackoverflow.com/questions/7808226
复制相似问题