【发布时间】:2018-07-17 16:35:56
【问题描述】:
我有一个 arduino 设备,它可以读取数据并以 64 字节的块发送数据。有时它可能会读取高达 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。
我的问题是:
- 当我不知道读取缓冲区长度时,如何让数据返回。
- 除了 DataReaderObject.LoadAsync() 之外,还有没有其他方法可以从 UWP 中的串行设备读取数据?即一个while循环,它继续读取数据直到找不到更多数据?或者类似 RS232_PollComport() 的东西?
【问题讨论】:
-
您必须改进协议,以便阅读器代码有机会正确处理。一个简单的方法是让 Arduino 先发送字节数,然后发送实际字节。读者现在可以读取该计数和循环,重复调用 LoadAsync() 以获取所有数据。 HTTP 协议的工作方式也是如此。
标签: c# uwp serial-port