我想使用RS232与DSP通信,所以我使用System.IO.SerialPort来实现这一点。除了阅读表现外,一切顺利。
每200ms,端口可以收到144个字节的包。但在测试中,应用程序几乎不会跳过其他所有包。我尝试在控制台中打印系统时间。令我惊讶的是,下面的代码(当长度= 140时)花了我超过200ms。它让应用程序无法及时处理数据。
我做错了什么?
港口物业:
BaudRate = 9600
奇偶校验=无
StopBits = One
private byte[] ReadBytesInSpicifiedLength(int length)
{
byte[] des = new byte[length];
for (int i = 0; i < length; i++)
{
des[i] = (byte)serialPort.ReadByte();
}
return des;
}
答案 0 :(得分:1)
你正在做很多单独的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#代码应该使用的内容。