我正在创建一个UWP应用程序,需要通过它公开的虚拟串口从USB输入设备读取数据。
我使用this tutorial使用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
因此,尽管等待1000ms(为了让设备有足够的时间发送缓冲区中的内容),BytesReceived
无法检测到任何数据,但LoadAsync
之后会立即读取75个字节。
答案 0 :(得分:1)
DataReader.LoadAsync()在收到一个或多个字节之前不会返回。如果您的输入缓冲区为空,它将阻止您的代码。
您可以使用CancellationToken取消读取任务,以“刷新”串行输入缓冲区。
下面是执行此操作的代码。
using (var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(1000)))
{
await dataReaderObject.LoadAsync(1024).AsTask(cts.Token);
}