我能够从串行AT设备(即只说“AT”命令的串行设备)读取数据的唯一方法是一次读取一个字节。
问题在于,如果我尝试读取的内容超过了从设备获取的代码冻结,则LoadAsync方法永远不会返回。我的解决方案是一次读取一个字节并使用取消令牌,如果它在几毫秒后没有返回,它将取消该任务。
public async Task<DeviceResponse> ReadStringInBatchAsync(int timeoutMilliseconds)
{
readCancellationTokenSource = new CancellationTokenSource();
readCancellationTokenSource.CancelAfter(timeoutMilliseconds);
Task<UInt32> loadAsyncTask;
DeviceDataReader.InputStreamOptions = InputStreamOptions.Partial;
UInt32 bytesRead = 0;
string response = string.Empty;
try
{
do
{
loadAsyncTask = DeviceDataReader.LoadAsync(1).AsTask(readCancellationTokenSource.Token);
bytesRead = await loadAsyncTask;
response += DeviceDataReader.ReadString(bytesRead);
} while (bytesRead > 0);
}
catch (Exception) { }
readCancellationTokenSource?.Dispose();
return new DeviceResponse() { FullResponse = response };
}
知道为什么会这样吗?我尝试使用非AT设备,读取超过1个字节没有问题。我也尝试过两种不同的AT设备,它们的行为方式相同。