使用通用 Class 库中的 Windows UWP Windows.Devices.SerialCommunication.SerialDevice
Using Windows UWP Windows.Devices.SerialCommunication.SerialDevice from Universal Class library
我正在制作一个 Modbus 库(再次...)。这次是 运行 在 Windows 10 IoT Core 上。
我遇到了一个有趣的问题。
这段代码:
string aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
var port = await SerialDevice.FromIdAsync(dis[0].Id);
if (port != null) {
port.BaudRate = 9600;
port.DataBits = 8;
port.StopBits = SerialStopBitCount.One;
port.Parity = SerialParity.None;
port.Handshake = SerialHandshake.None;
port.ReadTimeout = TimeSpan.FromMilliseconds(1000);
port.WriteTimeout = TimeSpan.FromMilliseconds(1000);
}
在通用应用程序中使用效果完美。当然,如果您将以下代码添加到 Package.appxmanifest:
<Capabilities>
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
</Capabilities>
从通用 Class 库中使用(文件 -> 新项目 -> ... -> Windows -> 通用 -> Class 库( Universal Windows) in VS2015) 从 mscorlib.dll 创建 Null Reference Exception,这与从 Universal 应用程序的 Package.appxmanifest.
中删除 DeviceCapability 相同
我怀疑此行为与 Class 库没有清单文件因此没有适当的权限有关。
我可以使用 class 个库中的 Windows.Devices.SerialCommunication 吗?
微软要我告诉用户 'Hey! I made for you a useless library for which you have to implement transport layer by yourself in any of your applications separately.' 吗?
我在 Windows 10 10586 使用 Visual Studio 2015 Update 1 创建了一个通用应用程序项目和一个通用 Class 库。我设置了应用程序清单,将 SerialDevice 代码放在图书馆并从应用程序中调用它。
有效。
请注意,如果您的代码被调用两次,您可能会遇到空引用异常,因为 port2 将为空。
var aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
var port = await SerialDevice.FromIdAsync(dis[0].Id);
Debug.WriteLIne(port?.PortName);
var aqs2 = SerialDevice.GetDeviceSelector();
var dis2 = await DeviceInformation.FindAllAsync(aqs);
var port2 = await SerialDevice.FromIdAsync(dis[0].Id);
//port2 will be null
Debug.WriteLine(port2?.PortName);
我正在制作一个 Modbus 库(再次...)。这次是 运行 在 Windows 10 IoT Core 上。
我遇到了一个有趣的问题。 这段代码:
string aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
var port = await SerialDevice.FromIdAsync(dis[0].Id);
if (port != null) {
port.BaudRate = 9600;
port.DataBits = 8;
port.StopBits = SerialStopBitCount.One;
port.Parity = SerialParity.None;
port.Handshake = SerialHandshake.None;
port.ReadTimeout = TimeSpan.FromMilliseconds(1000);
port.WriteTimeout = TimeSpan.FromMilliseconds(1000);
}
在通用应用程序中使用效果完美。当然,如果您将以下代码添加到 Package.appxmanifest:
<Capabilities> <DeviceCapability Name="serialcommunication"> <Device Id="any"> <Function Type="name:serialPort" /> </Device> </DeviceCapability> </Capabilities>
从通用 Class 库中使用(文件 -> 新项目 -> ... -> Windows -> 通用 -> Class 库( Universal Windows) in VS2015) 从 mscorlib.dll 创建 Null Reference Exception,这与从 Universal 应用程序的 Package.appxmanifest.
中删除 DeviceCapability 相同
我怀疑此行为与 Class 库没有清单文件因此没有适当的权限有关。
我可以使用 class 个库中的 Windows.Devices.SerialCommunication 吗?
微软要我告诉用户 'Hey! I made for you a useless library for which you have to implement transport layer by yourself in any of your applications separately.' 吗?
我在 Windows 10 10586 使用 Visual Studio 2015 Update 1 创建了一个通用应用程序项目和一个通用 Class 库。我设置了应用程序清单,将 SerialDevice 代码放在图书馆并从应用程序中调用它。
有效。
请注意,如果您的代码被调用两次,您可能会遇到空引用异常,因为 port2 将为空。
var aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
var port = await SerialDevice.FromIdAsync(dis[0].Id);
Debug.WriteLIne(port?.PortName);
var aqs2 = SerialDevice.GetDeviceSelector();
var dis2 = await DeviceInformation.FindAllAsync(aqs);
var port2 = await SerialDevice.FromIdAsync(dis[0].Id);
//port2 will be null
Debug.WriteLine(port2?.PortName);