使用通用 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);
}
  1. 在通用应用程序中使用效果完美。当然,如果您将以下代码添加到 Package.appxmanifest:

    <Capabilities>
         <DeviceCapability Name="serialcommunication">
             <Device Id="any">
                 <Function Type="name:serialPort" />
             </Device>
         </DeviceCapability>
     </Capabilities>
    
  2. 从通用 Class 库中使用(文件 -> 新项目 -> ... -> Windows -> 通用 -> Class 库( Universal Windows) in VS2015) 从 mscorlib.dll 创建 Null Reference Exception,这与从 Universal 应用程序的 Package.appxmanifest.

  3. 中删除 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);