2011-06-09 170 views
0

我正在尝试使用SerialPort类来处理串行端口。C#串行端口通信

该应用程序要求我们先收到一个命令,然后在20ms内给出答复;问题在于,我们读取的命令与实际命令之间存在延迟(最长15ms),并且我们没有时间将回复发送回去。

我们需要读取的命令的长度固定为20个字节,我们每次从输入缓冲区轮询一个字节。

serialPort.Read(input, 0, 1). 

我不知道这个过程有什么问题。

回答

2

为什么每次读一个字节?如果你期待的20个字节,你可以写:

byte[] buffer = new byte[20]; 
int bytesRead; 
int totalBytesRead = 0; 
while ((bytesRead = serialPort.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead)) != 0 
    && totalBytesRead < buffer.Length) 
{ 
    totalBytesRead += bytesRead; 
} 

在这一点上,你把所有20个字节或已到达流的末尾。

你是什么意思?“我们阅读的命令和实际的命令之间存在延迟(最多15毫秒)”?

+0

我将使用范围来检查线上的数据,当我收到命令时,我将发送一封信与实际命令进行比较,从范围,我测量延迟高达15ms,我想知道这是什 – lin 2011-06-10 16:03:45

+0

你说当你告诉发送者发送一个字节,并且接收者实际读取它时,会有多达15毫秒的时间?有很多事情可能会导致这种情况。发送者可能会暂时缓冲,接收者可能会缓冲。接收者可能无法立即*对角色作出反应。有什么方法可以确定您的计算机何时接收到该角色? 15毫秒是相当可疑的,因为这是你将从.NET程序中获得的最佳分辨率。 – 2011-06-10 17:58:53

1

您是否在使用DataRecieved事件?前段时间我有类似的错误,显然有些功能没有使用事件处理程序就不会被调用。

+0

我没有使用DataRecieved事件,你的意思是我应该使用DataRecieved事件,逐个轮询数据的insteading? – lin 2011-06-10 11:46:49

+0

@lin:使用'DataReceived'是一个非常好的主意。 – 2011-06-10 17:59:13

+0

您应该定义使用事件,在我的情况下,我从来没有实际收到任何数据而没有使用该事件,但花了几天的时间才弄清楚。 – Bas 2011-06-14 13:20:33