windows - 树莓派 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传感器的输出。我可以看到不断涌现的价值。所以传感器没有问题。由于一开始能看到树莓派的几行数据,就明白连接没有错。
有谁知道我哪里出错了?
感谢您的时间。
解决方案
请尝试使用以下代码。继续阅读,直到我们使用完整的流。
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# 的完整示例,你可以谷歌它。
推荐阅读
- haskell - 将二进制数转换为没有递归性的十进制数 [HASKELL]
- android - 将注册用户的列表数据从一个应用程序发送到另一个应用程序?
- google-chrome - 如何将关键事件从应用程序发送到 Chrome OS 中的其他应用程序?
- ffmpeg - Ffmpeg将原始视频的两倍大小的视频转换为第二部分没有音频
- c++ - 未在范围内声明的函数/如何一起使用 header.h、header.cpp 和 main.cpp?
- c++ - 具有命名空间范围的名称的 c++ 内部链接
- python - 无法将复数转换为浮点数
- android - 在导航抽屉菜单项中更改开关颜色
- sonarqube - 错误:未指定属性“sonar.cfamily.build-wrapper-output”Sonarqube
- sql-server-2012 - SQLSTATE[08001]:[Microsoft][ODBC Driver 11 for SQL Server]TCP 提供程序:无法建立连接,因为目标计算机主动拒绝