C# UWP,设备COM端口号在第二次呼叫SerialDevice.FromIdAsync中为空

C# UWP,设备COM端口号在第二次呼叫SerialDevice.FromIdAsync中为空,c#,xaml,uwp,serial-port,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 DeviceInf

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

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

您有:

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);
你有:

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);
我在第一次和第二次调用之间添加了Dispose()。 现在,我得到了预期的结果

Start
COM=COM15
COM=
end
我以为“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;
        }
在UWP应用中,没有开放的串行方法。 什么时候开门?是“SerialDevice.FromIdAsync”吗

另一个问题

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

更新1:

我找到了一个 我将学习:)

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

Start
COM=COM15
COM=
end
我以为“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;
        }
在UWP应用中,没有开放的串行方法。 什么时候开门?是“SerialDevice.FromIdAsync”吗

另一个问题

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

更新1:

我找到了一个 我会学的:)

:)你说得对,呵呵。。抱歉,我的测试应用程序错误。。。但结果是一样的。。。我修改了我的上述代码。:)你是对的,呵呵。。抱歉,我的测试应用程序错误。。。但结果是一样的。。。我修改了我的上述代码。