【问题标题】:Using Windows UWP Windows.Devices.SerialCommunication.SerialDevice from Universal Class library使用通用类库中的 Windows UWP Windows.Devices.SerialCommunication.SerialDevice
【发布时间】:2016-03-17 23:55:15
【问题描述】:

我正在制作一个 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. 在通用类库中使用(文件 -> 新项目 -> ... -> Windows -> 通用 -> VS2015 中的类库(通用 Windows))从 mscorlib.dll 创建空引用异常,它与从通用应用的 Package.appxmanifest 中删除 DeviceCapability 相同。

我怀疑这种行为与没有清单文件的类库有关,因此没有适当的权限。

我可以在类库中使用 Windows.Devices.SerialCommunication 吗?

微软是否让我告诉用户“嘿!我为你做了一个无用的库,你必须自己在任何应用程序中单独实现传输层。 ?

【问题讨论】:

  • 它可以在桌面上使用吗?
  • @danvy 同样的事情。我检查了它是否使用了正确的设备,结果发现设备 ID 在两种情况下(类库和应用程序)完全相同。只有一个,唯一的区别是上面的代码是放在类库中还是直接放在应用程序中。感谢您的回复。
  • 你读过这个库吗?我也在找 UWP 库!

标签: c# serial-port win-universal-app class-library windows-10-iot-core


【解决方案1】:

我在 Windows 10 10586 上使用 Visual Studio 2015 Update 1 创建了一个通用应用项目和一个通用类库。我设置了应用清单,将 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);

【讨论】:

  • 确实它被调用了两次 - 在将旧代码移植到新平台的所有混乱中,我忽略了它。这真是一种耻辱。我很,很高兴这是我的错。感谢您的帮助,祝您有愉快的一天。
  • 为什么windows不能第二次返回PortName?我想制作一个按钮来显示 PortName 列表。然后,我想打 2,3,4 次或更多...请指教..
猜你喜欢
  • 2015-11-08
  • 2018-01-02
  • 2016-01-24
  • 2016-12-24
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2016-04-25
相关资源
最近更新 更多