有没有办法确定在C#中从SerialPort读取时是否没有剩余数据?

时间:2014-11-02 03:32:33

标签: c# serial-port

我正在尝试从SerialPort读取数据,而我现在要做的是每隔100ms轮询一次SerialPort并查看它是否包含任何剩余数据。

    public static async Task<string> ReadRemaining(SerialPort port)
    {
        int prevBytesToRead = 0;
        await Task.Delay(100);
        while (prevBytesToRead != port.BytesToRead || port.BytesToRead == 0)
        {
            prevBytesToRead = port.BytesToRead;
            await Task.Delay(100);
        }
        return port.ReadExisting();
    }

我觉得这是非常低效的。还有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

你已经在使用BytesToRead属性,这不是最好的方法 1 ,但我想这对你有用。

您似乎要求预测未来,您要询问尚未从其他设备发送的数据。串口无法知道这一点。也许基于您的应用程序协议,另一台设备会告诉您何时完成发送(消息结束标记)或者可能告诉您消息的持续时间。

你必须弄清楚如何重新解释这个问题,这样就不需要预言未来。


1 使用串行端口和C#异步的简洁方法是调用port.BaseStream.ReadAsync。确保正确设置超时。在Win32超时下,您可以检测流中通常对应于消息边界的间隙,遗憾的是.NET SerialPort不允许这样做。但是你仍然可以找到ReadTimeout属性比默认值更好的值。