串口性能

时间:2014-08-27 14:08:24

标签: c# serial-port

我想使用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;
    }

1 个答案:

答案 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#代码应该使用的内容。