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