Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataReceived事件有时不';t火_C#_Serial Port_Hardware - Fatal编程技术网

C# DataReceived事件有时不';t火

C# DataReceived事件有时不';t火,c#,serial-port,hardware,C#,Serial Port,Hardware,我正在使用SerialPort与设备通信。该设备具有RS-485,另一侧(PC)为RS-232(虚拟端口)。该设备正常工作、发送和接收数据 问题是,有时不会触发DataReceived事件。我使用System.Timer向设备发送数据,每10秒发送一次。大多数情况下,它工作正常,但每1-10分钟我都没有得到响应,然后,在多触发2-4次DataReceived事件后,我得到一个数据集群(我之前“请求”的所有内容都在缓冲区中) 我的问题是:这怎么可能 很抱歉,我不能在这里给出代码示例,但我的应用程序

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

问题是,有时不会触发DataReceived事件。我使用System.Timer向设备发送数据,每10秒发送一次。大多数情况下,它工作正常,但每1-10分钟我都没有得到响应,然后,在多触发2-4次DataReceived事件后,我得到一个数据集群(我之前“请求”的所有内容都在缓冲区中)

我的问题是:这怎么可能

很抱歉,我不能在这里给出代码示例,但我的应用程序中没有多线程(只有主线程和具有计时器和DataReceived事件的线程,我认为它们在单独的线程上引发),我的DataReceived事件处理得很快,不应该并行引发(10秒足够长了,设备响应时间不足1秒)。如果我使用Thread.Sleep,它会出现在我确信它不会干扰任何东西的地方


这可能更多的是硬件问题,而不是软件问题,因为当我使用其他应用程序测试COM端口时,COM端口的运行方式与之类似(其中一个应用程序是用于测试连接的设备制造商提供的,看起来不像是用C语言编写的)。但我对硬件不太在行。可能是电脑或COM端口(不是内置的,而是外部的)出了问题?或者可能是操作系统相关的问题(我的应用程序是在Windows Server 2003下运行的Windows服务)。

在我看来,缓冲区并没有按预期刷新

不能保证为接收到的每个字节引发DataReceived事件。请使用 BytesToRead属性来确定缓冲区中还有多少数据需要读取

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


您是否尝试过调整和属性?这就是我将开始调查的地方。您知道消息的大致大小吗?您可能希望将ReceivedBytestThreshold属性设置为略低于您期望从设备接收的最小消息大小。然后,您可能需要一段短时间的忙等待来获取最后几条消息字节来完成消息。

在我看来,缓冲区并没有在您期望的时候被刷新

不能保证为接收到的每个字节引发DataReceived事件。请使用 BytesToRead属性来确定缓冲区中还有多少数据需要读取

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


您是否尝试过调整和属性?这就是我将开始调查的地方。您知道消息的大致大小吗?您可能希望将ReceivedBytestThreshold属性设置为略低于您期望从设备接收的最小消息大小。然后,您可能需要一段短时间的忙等待来获取最后几条消息字节来完成消息。

原来是硬件问题

设备之间的连接如下所示: 设备RS-485转换器1 LAN转换器2 RS-232计算机虚拟COM

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


谢谢@Matthew Rodatus的帮助。你迂回的回答引导我检查我的COM的确切内容和确切时间

原来是硬件问题

设备之间的连接如下所示: 设备RS-485转换器1 LAN转换器2 RS-232计算机虚拟COM

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


谢谢@Matthew Rodatus的帮助。你迂回的回答引导我检查我的COM的确切内容和确切时间

在我的应用程序中,ReceivedBytesThreshold=1(这是默认值)。MSDN表示ReadBufferSize不能小于4096。奇怪的是,我还有另外两个Windows服务与同一台机器上运行的COM端口(稍有不同的设备,通过普通的RS-232连接到计算机)通信,它们工作正常。事件在其案例中正确引发和执行。所有3个的代码库都是相同的,第3个的代码库有一些修改。程序的结构确保在前一个DataReceived事件完成执行之前不会有数据到达。在我的应用程序中,ReceivedBytesThreshold=1(这是默认值)。MSDN表示ReadBufferSize不能小于4096。奇怪的是,我还有另外两个Windows服务与同一台机器上运行的COM端口(稍有不同的设备,通过普通的RS-232连接到计算机)通信,它们工作正常。事件在其案例中正确引发和执行。所有3个的代码库都是相同的,第3个的代码库有一些修改。程序的结构确保在前一个DataReceived事件完成执行之前没有数据到达。没问题,@Arie。很高兴你明白了。没问题,@Arie。很高兴你明白了。