我正在创建一个UWP应用程序,该应用程序需要通过它公开的虚拟串行端口从USB输入设备读取数据。
我已经使用本教程使用SerialCommunication.SerialDevice
该类来实现一个可行的原型。但是,我需要在第一次打开串行端口时刷新输入流,以丢弃应用程序连接到输入设备之前可能在输入设备的缓冲区中的所有不需要的数据。
显而易见的解决方案似乎是继续读取端口,直到没有剩余可读取的内容为止。像这样的东西:
uint bytes;
do
{
bytes = await _dataReader.LoadAsync(ReadBufferLength);
_dataReader.ReadString(bytes);
} while (bytes > 0);
但是,这不起作用,因为LoadAsync()
如果没有要读取的数据将无限期等待。
有没有办法在尝试读取输入流之前查询输入流的内容,或者无条件刷新该输入流?
谢谢你的建议
提姆
更新:为了响应@Hans Passant的评论,我对代码进行了如下修改,以在尝试读取输入缓冲区之前检测其内容:
await Task.Delay(1000);
Debug.WriteLine("BytesReceived: {0}", _serialDevice.BytesReceived); // 0 bytes
var bytesRead = await _dataReader.LoadAsync(ReadBufferLength);
Debug.WriteLine("BytesRead: {0}", bytesRead); // 75 bytes
因此,尽管等待了1000毫秒(以便让设备有足够的时间发送其缓冲区中的内容),但仍BytesReceived
无法检测到任何数据,但LoadAsync
此后立即读取了75个字节。
在收到一个或多个字节之前,DataReader.LoadAsync()不会返回。如果您的输入缓冲区为空,它将阻止您的代码。
您可以使用CancellationToken取消读取任务,以便“刷新”串行输入缓冲区。
下面是实现此目的的代码。
using (var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(1000)))
{
await dataReaderObject.LoadAsync(1024).AsTask(cts.Token);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句