【问题标题】:Is there a way to determine whether there is no remaining data when reading from SerialPort in C#?有没有办法确定在C#中从SerialPort读取时是否没有剩余数据?
【发布时间】:2014-11-04 03:04:03
【问题描述】:

我正在尝试从 SerialPort 读取数据,而我现在要做的是每 100 毫秒轮询一次 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# serial-port


    【解决方案1】:

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

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

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


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

    【讨论】:

    • 谢谢本。我已经阅读了您的博客,了解我们应该如何真正将 port.BaseStream.ReadAsync 用于 COM I/O,但我无法找到一个很好的示例来读取流“直到在一段时间间隔后没有输入”。可以举个例子吗?
    • @derekh:该行为由ReadIntervalTimeout 在COMMTIMEOUTS 结构中提供...但是.NET SerialStream.ReadTimeout 属性不会将其设置为除INFINITE 之外的任何值。而且我看不到获取句柄以 p/invoke SetCommTimeouts 的方法。所以你必须做每次调用读取超时。
    • 好的。我想我现在可以弄清楚了。 :) 谢谢本!
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2017-11-13
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多