自己在UWP程序上调用usb转串口的路程

之前一直是在普通的framework环境下写串口,使用的类为 SerialPort 这个类大家可能比较熟悉。但是在UWP的开发里,使用的是 SerialDevice 这个类,是不一样的。

1. 清单文件配置

首先,你需要建立UWP项目(Universal Windows),之后配置 Package.appxmanifest 文件。我们就叫它清单文件吧,如果你直接双击打开是以界面的方式编辑的,我们想要编辑的是 Capabilities 节点,因为我们要启用设备访问权限。但是微软的配置此节点的相关文章也指出了,在这个操作界面里有一些节点并不会列出,需要手动修改清单文件。

为了手动修改清单文件的xml节点,我们右击这个清单文件,选择“Open With...”,也就是所谓的打开方式,之后选择使用“XML Editor”打开,便可以以XML代码的方式编辑了。

  <Capabilities>
    <Capability Name="internetClient" />
    <DeviceCapability Name="serialcommunication">
      <!--<Device Id="any">-->
      <Device Id="vidpid:1A86 7523">
        <Function Type="name:serialPort"/>
      </Device>
    </DeviceCapability>
  </Capabilities>

清单文件XML根节点为Package,当然如果你之前启用了其他权限,比如我这里有一个internetClient权限启用过。

配置串口访问功能,除了Device行,其他的都是固定写法。本行可以指定想访问的设备,设备的vid和pid标识可以在设备管理器中定位到设备并查看属性得到,一般会根据驱动提供商的公司和产品系列不同而不同。至于不指定标识直接写any我并没有试过,但是在网站上翻阅资料时,见到好几个地方是这么写的,如果你不确定设备到底有没有固定型号,或者插了多个不同型号的设备之后手动选择,这里指定any应该就能达到不筛选的效果。

2. 访问串口并收发数据

    public async Task StartAsync()
    {
      string filter = SerialDevice.GetDeviceSelector();
      var devices = await DeviceInformation.FindAllAsync(filter);

      foreach (var jd in devices)
      {
        try
        {
          Debug.WriteLine("即将尝试握手串口:" + jd.Name);
          var client = await SerialDevice.FromIdAsync(jd.Id);
          client.BaudRate = 115200;

          // send
          var sendDatas = new byte[] { 0x83, 0xC1, 0x00, 0x00, 0x42 };
          var wBuffer = CryptographicBuffer.CreateFromByteArray(sendDatas);
          var sw = await client.OutputStream.WriteAsync(wBuffer);

          // read
          var rBuffer = await client.InputStream.ReadAsync(new Windows.Storage.Streams.Buffer(11), 11, InputStreamOptions.None);
          string rString = CryptographicBuffer.EncodeToHexString(rBuffer);
          Debug.WriteLine("received:" + rString);
        }
        catch (Exception ex)
        {
          Debug.Fail(ex.Message, ex.ToString());
        }
      }
    }

上面的连接串口收发功能,是最简单的。

posted @ 2018-12-03 17:32  三台  阅读(943)  评论(0编辑  收藏  举报