有没有一种方法可以确定从C#中的SerialPort读取时是否没有剩余的数据

本文关键字:是否 读取 SerialPort 中的 数据 一种 方法 有没有 | 更新日期: 2023-09-27 18:28:41

我正在尝试从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();
    }

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

有没有一种方法可以确定从C#中的SerialPort读取时是否没有剩余的数据

您已经在使用BytesToRead属性,这实际上不是最好的方法1,但我想它对您有效。

你似乎在询问对未来的预测,你在询问尚未从其他设备发送的数据。串行端口无法知道这一点。可能是基于您的应用程序协议,另一个设备会告诉您何时完成发送(消息结束标记),或者可能会告诉您消息的长度

你必须弄清楚如何重新表述这个问题,这样就不需要预测未来了。


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