首页 > 解决方案 > 树莓派 3 +Windows IOT Core UART

问题描述

我正在使用 Raspberry Pi 3 Model B。我已经在其中安装了 Windows 10 IOT Core。我正在使用 Visual Studio 15 在 C# 中开发 UWP 应用程序并在板上部署了一个应用程序。它通过 Neo6mv2 GPS 模块的 UART 引脚 8 和 10 读取 GPS 数据,并在文本框中显示原始数据。简单的。

我已经使用以下函数配置了 UART 端口:

public async void UART_Config()
{
    string selector = SerialDevice.GetDeviceSelector("UART0");
    DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);

    if (devices.Count > 0)
    {
        DeviceInformation deviceInfo = devices[0];
        serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);
        dataReader = new DataReader(serialDevice.InputStream);
        dataWriter = new DataWriter(serialDevice.OutputStream);
        bytesToRead = await dataReader.LoadAsync(maxReadLength);

    }
    else
    {
    }
}

我在一个以 1 秒的间隔调用的滴答定时器函数中读取数据。GPS 传感器给出一系列字符串,每行末尾带有“\n”。所以我使用while循环分隔行并更新文本框Location.Text中的每一行。

public  void AcQ_Tick(object sender, object e)
{
    rxBuffer = "";            //  string rxBuffer
    try
    {    
        while (dataReader.ReadString(1) != "\n")
        {
            rxBuffer += dataReader.ReadString(1);
        }
        Location.Text = rxBuffer;
    }
    catch (Exception e1)
    {
        Status.Text = e1.ToString();
    }
}

问题是,每次我重新加载程序时成功输出几行数据后,树莓派都会在 while 循环内的“dataReader.ReadString(1)”函数处抛出异常。之后它再也不会读取数据。

抛出的异常如下所示:

"System.Runtime.InteropServices.COMException (0x8000000B):该操作试图访问有效范围之外的数据\r\n\r\n该操作试图在 Windows 上访问有效范围之外的数据\r\n\r\n。 Storage.Streams.DataReader.ReadString(UInt32 codeUnitCount)\r\n"

我通过腻子检查了GPS传感器的输出。我可以看到不断涌现的价值。所以传感器没有问题。由于一开始能看到树莓派的几行数据,就明白连接没有错。

有谁知道我哪里出错了?

感谢您的时间。

标签: windowsc#-3.0raspberry-pi3uartwindows-10-iot-core

解决方案


请尝试使用以下代码。继续阅读,直到我们使用完整的流。

public  void AcQ_Tick(object sender, object e)
{
    rxBuffer = "";            //  string rxBuffer
    try
    {    
        while (dataReader.UnconsumedBufferLength > 0)
        {
            uint bytesToRead = dataReader.ReadUInt32();
            rxBuffer += dataReader.ReadString(bytesToRead);
            if( strRead.EndWith("\n") )
            {
                rxBuffer += dataReader.ReadString(1);
            }            
        }

        Location.Text = rxBuffer;
    }
    catch (Exception e1)
    {
        Status.Text = e1.ToString();
    }
}

对 ReadString 的调用需要一定长度的“代码单元”才能读取。这就是“在线”时每个字符串前面都有其长度的原因。有一个关于 RPi Using The UART with C# 的完整示例,你可以谷歌它。


推荐阅读