在第二次调用SerialDevice.FromIdAsync中,UWP,Device COM端口号为NULL

时间:2017-07-26 02:17:59

标签: c# xaml uwp serial-port

获取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也指出了同样的问题。我在这里写评论。但为了得到答案,我将其作为新问题发布。

问:要在设备更改时获取COM端口列表和更新列表,我应该编写什么代码?

2 个答案:

答案 0 :(得分:0)

你有:

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);

答案 1 :(得分:0)

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

我想&#34; SerialDevice.FromIdAsync&#34;意思是开放串口。 然后,第二次访问返回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方法。 什么时候开门?是&#34; SerialDevice.FromIdAsync&#34; ??

另一个问题

有没有办法知道&#34; COM端口号&#34;没有打开设备? 没有&#34; SerialDevice.FromIdAsync&#34; ? 因为我只想制作COM1,COM2,COM3的下拉菜单....

更新1:

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