UWP C#从串行设备读取64Byte数据块

时间:2018-02-07 11:41:25

标签: c# uwp serial-port

我有一个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。

我的问题是:

  1. 当我不知道读取缓冲区长度时,如何获取数据。
  2. 除了DataReaderObject.LoadAsync()之外,没有其他方法可以从UWP中的串行设备读取数据吗?即一个while循环,它继续读取数据,直到找不到更多?或类似RS232_PollComport()?

1 个答案:

答案 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();