【问题标题】:UWP C# Read 64Byte chuncks of data from Serial deviceUWP C# 从串行设备读取 64 字节数据块
【发布时间】: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。

我的问题是:

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

【问题讨论】:

  • 您必须改进协议,以便阅读器代码有机会正确处理。一个简单的方法是让 Arduino 先发送字节数,然后发送实际字节。读者现在可以读取该计数和循环,重复调用 LoadAsync() 以获取所有数据。 HTTP 协议的工作方式也是如此。

标签: c# uwp serial-port


【解决方案1】:

不知道读取缓冲区长度时如何让数据返回。

我没有用于测试的设备,但尝试更新您的代码 sn-p,如下所示:

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 将返回缓冲区长度,并且仍然需要加载数据。但是在您的代码 sn-p 中,您只继续使用while (bytesRead == 0) 加载,因此在这种情况下,您只加载一次数据长度与readBufferLength 相同的数据。您可能需要继续 LoadAsyncwhile (bytesRead == ReadBufferLength)

我不知道读取缓冲区的长度

您也可以尝试使用看起来更简单的StreamReader。例如:

Stream streamIn = EventHandlerForDevice.Current.Device.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多