串口性能

幽灵飞行

我想使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章