【发布时间】: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