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

在C#中读取SerialPort时,是否有方法确定是否没有剩余数据?,c#,serial-port,C#,Serial Port,我正在尝试从SerialPort读取数据,现在我正在尝试每100ms轮询一次SerialPort,看看它是否包含任何剩余数据 public static async Task<string> ReadRemaining(SerialPort port) { int prevBytesToRead = 0; await Task.Delay(100); while (prevBytesToRead != port.Byte

我正在尝试从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();
    }
公共静态异步任务ReadRemaining(串行端口)
{
int prevBytesToRead=0;
等待任务。延迟(100);
while(prevBytesToRead!=port.BytesToRead | | port.BytesToRead==0)
{
prevBytesToRead=port.BytesToRead;
等待任务。延迟(100);
}
返回端口。ReadExisting();
}

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

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

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

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



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

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

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

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



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

谢谢Ben。我读过你的博客,内容是关于如何真正将port.BaseStream.ReadAsync用于COM I/O,但我无法找到一个阅读流的好例子“直到在一段时间间隔后没有输入”。你能给我举个例子吗?@derekh:这种行为是由
COMMTIMEOUTS
结构中的
ReadIntervalTimeout
提供的。。。但是.NET
SerialStream.ReadTimeout
属性不会将其设置为除
INFINITE
之外的任何值。我看不到一种方法来获取句柄以便p/invoke
setcommtimeout
。所以你必须在每次通话中读取超时。好的。我想我现在可以弄明白了谢谢你,本!谢谢你,本。我读过你的博客,内容是关于如何真正将port.BaseStream.ReadAsync用于COM I/O,但我无法找到一个阅读流的好例子“直到在一段时间间隔后没有输入”。你能给我举个例子吗?@derekh:这种行为是由
COMMTIMEOUTS
结构中的
ReadIntervalTimeout
提供的。。。但是.NET
SerialStream.ReadTimeout
属性不会将其设置为除
INFINITE
之外的任何值。我看不到一种方法来获取句柄以便p/invoke
setcommtimeout
。所以你必须在每次通话中读取超时。好的。我想我现在可以弄明白了谢谢你,本!