【问题标题】:WindowsIotCore Raspberry Pi UWP Serial port access issue(System.AccessViolationException)WindowsIotCore Raspberry Pi UWP 串口访问问题(System.AccessViolationException)
【发布时间】:2019-02-06 10:56:27
【问题描述】:

我正在尝试使用 Raspberry Pi 3 的串行引脚为 WindowsIotCore 平台上的 UWP 应用程序输入。我不断收到此异常:

System.AccessViolationException
HResult=0x80004003
Message=Attempted to read or write protected memory. This is often an 
indication that other memory is corrupt.

出现这个异常的代码是:

SerialDevice serialPort = null;
string aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
serialPort = await SerialDevice.FromIdAsync(dis[0].Id);
serialPort.WriteTimeout = TimeSpan.FromMilliseconds(500);
serialPort.ReadTimeout = TimeSpan.FromMilliseconds(200);
serialPort.BaudRate = 9600;
serialPort.Parity = SerialParity.None;
serialPort.StopBits = SerialStopBitCount.One;
serialPort.DataBits = 8;
serialPort.Handshake = SerialHandshake.None;

更新: 我创建了一个新的 UWP 项目并使用相同的代码,在相同的平台上,在相同的 Raspberry Pi 上,使用相同的开发 PC,代码运行良好。

【问题讨论】:

  • 检查那些awaited 函数调用的返回值——很确定你得到一个TResult,而不是你期望的实际类型
  • 调试后发现,每当调用和设置serialPort变量的属性时,代码都会出现异常,serialPort = await SerialDevice.FromIdAsync(dis[0].Id);此命令应将 serialPort 变量设置为选择的串行设备,但变量保持为 null 我也在同一平台上的新项目中使用了同样的方法,然后它工作得非常好
  • @daniyalselani 如果 SerialDevice.FromIdAsync(dis[0].Id) retrun null 你需要检查设备功能(<DeviceCapability Name="serialcommunication"> <Device Id="any"> <Function Type="name:serialPort" /> </Device> </DeviceCapability>)是否添加到 package.appxmanifest。
  • @RitaHan-MSFT,我已经通过 Visual Studio 编辑了 package.appxmanifest 文件,但是我再次检查,由于某种原因,通过 Visual Studio 对文件所做的任何编辑都没有被保存。使用外部编辑器编辑文件后,我发现我的代码没有问题。现在问题已经解决了。谢谢
  • 嗨,daniyal,问题解决了,您可以接受您的解决方案作为答案。如何接受可以参考here的答案。

标签: c# uwp raspberry-pi windows-10-iot-core


【解决方案1】:

我设法通过使用 notepad++ 编辑 package.appxmanifest 文件解决了这个问题 我已经通过 Visual Studio 2017 编辑了 package.appxmanifest 文件,但是我再次检查,由于某种原因,通过 Visual Studio 2017 对文件所做的任何编辑都没有被保存。使用外部编辑器编辑文件后,我发现我的代码没有问题。现在问题已经解决了。

【讨论】:

  • It is a known issue: "Visual Studio 2017 在 Manifest Designer 中有一个已知错误,会影响串行通信功能。如果您的 appxmanifest 添加了串行通信功能,使用设计器修改您的 appxmanifest 会损坏您的appxmanifest(设备 xml 子项将丢失)。您可以通过右键单击 appxmanifest 并从上下文菜单中选择查看代码来手动编辑 appxmanifest 来解决此问题。"
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多