我想使用RS232与DSP通信,因此我使用System.IO.SerialPort来实现这一点。除了阅读性能外,其他一切都进行得很好。
每200ms,该端口可以接收144个字节的数据包。但是在测试中,应用程序几乎跳过了其他所有程序包。我尝试在控制台中打印系统时间。令我惊讶的是,下面的代码(当长度= 140时)花了我200毫秒以上的时间。它使应用程序无法及时处理数据。
我做错什么了吗?
港口物业:
波特率= 9600
奇偶校验=无
StopBits = 1
private byte[] ReadBytesInSpicifiedLength(int length)
{
byte[] des = new byte[length];
for (int i = 0; i < length; i++)
{
des[i] = (byte)serialPort.ReadByte();
}
return des;
}
您要执行很多单独的I / O调用,这意味着要进行许多内核转换。那些很贵。无法达到每秒720字节的速度令人惊讶,但是您可以通过执行块读取使数据处理速度提高一个数量级:
private byte[] ReadBytesWithSpecifiedLength(int length)
{
byte[] des = new byte[length];
serialPort.BaseStream.Read(des, 0, des.Length);
return des;
}
如果启用了超时,则可能会导致部分读取。然后,您需要执行以下操作:
private byte[] ReadBytesWithSpecifiedLength(int length)
{
byte[] des = new byte[length];
int recd = 0;
do {
int partial = serialPort.BaseStream.Read(des, recd, length - recd);
if (partial == 0) throw new IOException("Transfer Interrupted");
recd += partial;
} while (recd < length);
return des;
}
有趣的BaseStream
是,它还具有异步支持(通过ReadAsync
)。这就是应该使用的新C#代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句