我有一个arduino设备,可以读取数据并以64Byte块的形式发送。有时它可能读取高达4MB
Serial.write(data, 64);
我尝试使用Microsoft example之后的UWP应用阅读此数据:
private async Task ReadAsync(CancellationToken cancellationToken, uint readBufferLength)
{
Task<UInt32> loadAsyncTask;
// Don't start any IO if we canceled the task
lock (ReadCancelLock)
{
cancellationToken.ThrowIfCancellationRequested();
// Cancellation Token will be used so we can stop the task operation explicitly
// The completion function should still be called so that we can properly handle a canceled task
DataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
loadAsyncTask = DataReaderObject.LoadAsync(readBufferLength).AsTask(cancellationToken);
}
UInt32 bytesRead = await loadAsyncTask;
while (bytesRead == 0)
{
bytesRead = await loadAsyncTask;
}
if (bytesRead > 0)
{
dataRead = new byte[bytesRead];
DataReaderObject.ReadBytes(dataRead);
ReadBytesCounter += bytesRead;
}
我不会因为每次我不知道读取缓冲区长度而从设备返回的数据量不同。当我将读缓冲区长度设置为高于4MB时,它无法返回任何数据。当我将它设置为低于4MB(比如32KB)时,它只返回32KB。
我的问题是:
答案 0 :(得分:0)
当我不知道读缓冲区长度时,如何获取数据。
我没有设备进行测试,但尝试更新您的代码段,如下所示:
UInt32 bytesRead = await loadAsyncTask;
while (bytesRead == ReadBufferLength)
{
bytesRead = await loadAsyncTask;
}
if (DataReaderObject.UnconsumedBufferLength > 0)
{
ReadBytesTextBlock.Text += DataReaderObject.ReadString(DataReaderObject.UnconsumedBufferLength);
}
当我将读缓冲区长度设置为高于4MB时,它无法返回任何数据。当我将它设置为低于4MB(比如32KB)时,它只返回32KB。
readBufferLength
参数设置为DataReader.LoadAsync
方法,表示要加载到中间缓冲区的字节数。因此,如果你设置的值高于数据长度,它应该工作。但避免设置缓冲区太大。如果将readBufferLength
设置为小于数据长度,await loadAsyncTask
将返回缓冲区长度,仍然需要加载数据。但是在您的代码段中,您只能继续加载while (bytesRead == 0)
,因此在这种情况下,您只需加载一次,其数据长度与readBufferLength
相同。您可能需要使用LoadAsync
继续while (bytesRead == ReadBufferLength)
。
我不知道读取缓冲区长度
此外,您可以尝试使用看起来更简单的StreamReader
。例如:
Stream streamIn = EventHandlerForDevice.Current.Device.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();