有没有一种方法可以确定从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();
}
我觉得这是非常低效的。有更好的方法吗?
您已经在使用BytesToRead
属性,这实际上不是最好的方法1,但我想它对您有效。
你似乎在询问对未来的预测,你在询问尚未从其他设备发送的数据。串行端口无法知道这一点。可能是基于您的应用程序协议,另一个设备会告诉您何时完成发送(消息结束标记),或者可能会告诉您消息的长度
你必须弄清楚如何重新表述这个问题,这样就不需要预测未来了。
1使用串行端口和C#异步的干净方法是调用port.BaseStream.ReadAsync
。确保超时设置正确。在Win32超时下,您可以检测流中通常与消息边界相对应的间隙,遗憾的是,.NET SerialPort不允许这样做。但是,您仍然可以为ReadTimeout
属性找到比默认值更好的值。