c# - SerialDevice.FromIdAsync() 产生一个空串口

标签 c# serial-port uwp

尝试连接到串行端口时,我的代码发生了一些奇怪的事情。使用 Serial Sample 时,一切正常,并且在第一次尝试时就连接了。但是,使用我的代码,串口返回一个空值。

我找到了一个变通方法,方法是在 do 循环中嵌套写入串行端口的调用,直到串行端口不再为空并且它可以工作。平均需要 500 个循环才能连接,并且它始终连接。我知道这很危险,因为如果它始终为 null,就会出现无限循环,所以我尝试将 do 循环切换为 for 循环。对于 for 循环,它总是返回 null,即使我将它迭代 50,000 次也是如此。有没有其他人遇到过这个并找到了更好的解决方案?我正在连接到 Arduino Uno。

我不只是使用串行示例代码的原因是因为我想使用下拉菜单并使用端口名称而不是设备 ID 名称。我的代码如下。谢谢。

    //lists com ports
    private async void listPorts()
    {
        try
        {
            string aqs = SerialDevice.GetDeviceSelector();
            var dlist = await DeviceInformation.FindAllAsync(aqs);
            status.Text = "Select a device and connect";

            for (int i = 0; i < dlist.Count; i++)
            {
                var port = await SerialDevice.FromIdAsync(dlist[0].Id);
                ConnectDevices.Items.Add(port.PortName);
            }

            comConnect.IsEnabled = true;
            ConnectDevices.SelectedIndex = 0;
        }
        catch (Exception ex)
        {
            status.Text = ex.Message;
        }
    }

    //connects to the selected com port
    private async void comConnect_Click(object sender, RoutedEventArgs e)
    {
        _key = 0;
        status2.Text = "";
        string aqs = SerialDevice.GetDeviceSelector(ConnectDevices.SelectedItem.ToString());
        var dlist = await DeviceInformation.FindAllAsync(aqs);
        if (dlist.Count <= 0)
        {
            status.Text = "No devices found.";
            return;
        }
        try
        {
            do
            {
                serialPort = await SerialDevice.FromIdAsync(dlist[0].Id);
                status.Text = "Connecting to serial port...";
            } while (serialPort == null);

            // Configure serial settings
            serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
            serialPort.BaudRate = 38400;
            serialPort.Parity = SerialParity.None;
            serialPort.StopBits = SerialStopBitCount.One;
            serialPort.DataBits = 8;
            serialPort.Handshake = SerialHandshake.None;
            status.Text = "Serial port configured successfully.";

我已将以下内容添加到 package.appmanifest

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

最佳答案

在我的项目中,在package.appmanifest中添加如下代码后,串口正常工作。

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

串口变量应该是“serialPort”。

关于c# - SerialDevice.FromIdAsync() 产生一个空串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37505107/

相关文章:

c# - 我应该在 string.Replace() 之前使用 string.Contains() 吗?

c# - 如何以编程方式退出 WPF 应用程序?

c# - 导出或保存 CX509PrivateKey

c# - Entity Framework 使用字符串选择表

c++ - 写入和读取十六进制trame qt串口

linux - 如何知道哪个 ttyS* 文件链接到哪个串行端口?

c# - 如何从另一个 SoftwareBitmap (UWP) 的区域创建 SoftwareBitmap

c++ - ReadFile() 返回空白数据

xaml - 当我更改主题设置时,为什么我的 AdaptiveTrigger 会触发?

uwp - 在 UWP 中动态更改应用标题