【问题标题】:UWP , Device COM port number is NULL in 2nd call SerialDevice.FromIdAsyncUWP,设备 COM 端口号在第二次调用 SerialDevice.FromIdAsync 时为 NULL
【发布时间】:2017-07-26 16:32:29
【问题描述】:

获取 COM 端口号(串行,例如:COM1,COM2,,,) 单击按钮时,我想在 UI 上显示可用的 COM 端口列表。第一次点击成功获取 COM 号,但第二次点击失败。你有什么理由吗?

这是一个测试两次点击的简单代码。

public async Task<bool> test()
{

    Debug.WriteLine("Start");

    var aqs = SerialDevice.GetDeviceSelector();
    var dis = await DeviceInformation.FindAllAsync(aqs);
    var port = await SerialDevice.FromIdAsync(dis[0].Id);
    Debug.WriteLine("COM=" + port?.PortName);
    var aqs2 = SerialDevice.GetDeviceSelector();
    var dis2 = await DeviceInformation.FindAllAsync(aqs2);
    var port2 = await SerialDevice.FromIdAsync(dis2[0].Id);
    //port2 will be null
    Debug.WriteLine("COM=" + port2?.PortName);

    Debug.WriteLine("end");

    return true;
}

public MainPage()
{
    this.InitializeComponent();
    Task.Run(() => this.test()).Wait();
}

并且 Package.appxmanifext 有这个代码。

<Capability Name="internetClient" />
    <DeviceCapability Name="serialcommunication">
        <Device Id="any">
            <Function Type="name:serialPort" />
        </Device>
    </DeviceCapability>
</Capabilities>

这是执行结果。

Start
COM=COM15
COM=
end

This post 也指出了同样的问题。我在这里写了评论。但为了得到答案,我将其发布为新问题。

Q : 更换设备时获取COM端口列表和更新列表,我应该写什么代码?

【问题讨论】:

    标签: c# xaml uwp serial-port


    【解决方案1】:

    你有:

    var aqs = SerialDevice.GetDeviceSelector();
    var dis = await DeviceInformation.FindAllAsync(aqs);
    var port = await SerialDevice.FromIdAsync(dis[0].Id);
    Debug.WriteLine("COM=" + port?.PortName);
    var aqs2 = SerialDevice.GetDeviceSelector();
    var dis2 = await DeviceInformation.FindAllAsync(aqs);
    var port2 = await SerialDevice.FromIdAsync(dis[0].Id);
    Debug.WriteLine("COM="+port2?.PortName);
    

    我想你应该有:

    .....
    var aqs2 = SerialDevice.GetDeviceSelector();
    var dis2 = await DeviceInformation.FindAllAsync(aqs2);
    var port2 = await SerialDevice.FromIdAsync(dis2[0].Id);
    Debug.WriteLine("COM="+port2?.PortName);
    

    【讨论】:

    • :) 你是对的,呵呵..对不起,我的测试应用程序错了.....但是结果是一样的...我修改了上面的代码。
    【解决方案2】:

    With this article, 我在第一次和第二次调用之间添加了 Dispose()。 现在,我得到了预期的结果。

    我认为“SerialDevice.FromIdAsync”是指打开串行端口。 然后,第二次访问返回 null。 然后我尝试在重新打开之前将其关闭...

    public async Task<bool> test()
            {
    
                Debug.WriteLine("Start");
    
                var aqs = SerialDevice.GetDeviceSelector();
                var dis = await DeviceInformation.FindAllAsync(aqs);
                var port = await SerialDevice.FromIdAsync(dis[0].Id);
                Debug.WriteLine("COM=" + port?.PortName);
    
                //closing device...
                port.Dispose();
                port = null;
    
                var aqs2 = SerialDevice.GetDeviceSelector();
                var dis2 = await DeviceInformation.FindAllAsync(aqs2);
                var port2 = await SerialDevice.FromIdAsync(dis2[0].Id);
                //port2 will be null
                Debug.WriteLine("COM="+port2?.PortName);
    
                Debug.WriteLine("end");
    
                return true;
            }
    

    这是结果(我预期的)。

    Start
    COM=COM15
    COM=COM15
    end
    

    在 UWP 应用程序中,没有 Open serial 方法。 什么时候开张?是“SerialDevice.FromIdAsync”吗??

    另一个问题

    有没有办法在不打开设备的情况下知道“COM端口号”? 没有“SerialDevice.FromIdAsync”? 因为我只想制作 COM1,COM2,COM3 的下拉菜单....

    更新 1:

    我找到了good example for UWP + Serial. 我会学的:)

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2016-12-08
      • 2023-03-28
      • 1970-01-01
      • 2018-01-01
      • 2017-11-02
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多