UWP串行端口访问-代码通常不';行不通

UWP串行端口访问-代码通常不';行不通,uwp,serial-port,gps,Uwp,Serial Port,Gps,我正在使用标准的NMEA GPS设备。串行端口从设备读取数据,并将数据转换为可转换为纬度和经度的字符串。这是我正在使用的代码: [TestMethod] public async Task TestReadAsync() { var aqs = SerialDevice.GetDeviceSelector("COM6"); var deviceInformationCollection = await DeviceInformation.F

我正在使用标准的NMEA GPS设备。串行端口从设备读取数据,并将数据转换为可转换为纬度和经度的字符串。这是我正在使用的代码:

    [TestMethod]
    public async Task TestReadAsync()
    {
        var aqs = SerialDevice.GetDeviceSelector("COM6");
        var deviceInformationCollection = await DeviceInformation.FindAllAsync(aqs);
        var goodRead = false;
        uint maxReadCount = 1024;
        var cancellationToken = new CancellationToken();
        var deviceInfo = deviceInformationCollection.FirstOrDefault();

        Assert.IsNotNull(deviceInfo);

        using (var serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id))
        {
            serialDevice.Parity = SerialParity.None;
            serialDevice.BaudRate = 4800;
            serialDevice.DataBits = 8;

            using (var dataReader = new DataReader(serialDevice.InputStream)
            {
                InputStreamOptions = InputStreamOptions.Partial,
                UnicodeEncoding = UnicodeEncoding.Utf8
            })
            {
                for (var i = 0; i < 15; i++)
                {
                    var dataReaderLoadOperation = dataReader.LoadAsync(maxReadCount);
                    using (var dataReaderLoadTask = dataReaderLoadOperation.AsTask(cancellationToken))
                    {

                        var readByteCount = await dataReaderLoadTask;
                        var buffer = new byte[readByteCount];
                        dataReader.ReadBytes(buffer);

                        var nmeaString = System.Text.Encoding.UTF8.GetString(buffer);

                        if (!string.IsNullOrEmpty(nmeaString))
                        {
                            Console.WriteLine(nmeaString);
                            goodRead = true;
                            break;
                        }
                    }

                    await Task.Delay(900);
                }
            }
        }

        Assert.IsTrue(goodRead);
    }
这里还有一个版本<代码>读取计数始终为0

    [TestMethod]
    public async Task TestReadAsync()
    {
        var aqs = SerialDevice.GetDeviceSelector("COM6");
        var deviceInformationCollection = await DeviceInformation.FindAllAsync(aqs);
        var goodRead = false;
        var maxReadCount = 1024;
        var deviceInfo = deviceInformationCollection.FirstOrDefault();

        Assert.IsNotNull(deviceInfo);
        using (var serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id))
        {
            serialDevice.BaudRate = 4800;
            serialDevice.Parity = SerialParity.None;
            serialDevice.DataBits = 8;

            var cancellationTokenSource = new CancellationTokenSource();

            using (var stream = serialDevice.InputStream.AsStreamForRead(0))
            {
                for (var i = 0; i < 100; i++)
                {
                    var buffer = new byte[maxReadCount];
                    var readCount = await stream.ReadAsync(buffer, 0, maxReadCount, cancellationTokenSource.Token);

                    if (readCount > 0)
                    {
                        var nmeaString = System.Text.Encoding.UTF8.GetString(buffer);

                        if (!string.IsNullOrWhiteSpace(nmeaString))
                        {
                            return;
                        }
                    }

                    Task.Delay(10);
                }
            }

        }

        Assert.IsTrue(goodRead);
    }

良好措施的能力:

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

注意:我知道该设备正在工作,因为它附带的应用程序能够读取位置,并且我可以看到那里的NMEA数据流。我还尝试了三个不同的USB端口,结果是三个不同的COM端口


那么,为什么这件事如此脆弱?是否有技巧让串行端口访问一致地在UWP上工作?有没有人有从UWP上的串行端口读取数据的经验?我缺少一些代码吗?

我检查了NMEA GPS设备使用简单的ASCII串行通信协议,该协议定义了数据如何在一个“句子”中一次从一个“说话者”传输到多个“听众”。但是我发现您的代码使用了
UTF8
。我尝试不指定UTF8,但没有任何区别。但这仅适用于字符串转换。问题是它根本不读取任何数据。您可以在整个代码中添加断点,然后再次复制。问题是否发生在正在创建的某个任务中?例如
dataReader.LoadAsync(maxReadCount)
call。如果我们可以在逐步检查代码的同时检查这些调用,它可能会为我们提供更多关于哪个特定调用可能导致问题的信息。很好,我将测试您的代码。获取它,如果我收到任何信息,我将在下面发布。
        using (var serialPortDevice = new WindowsSerialPortDevice(@"\\.\COM6"))
        {
            await serialPortDevice.InitializeAsync();
            var result = await serialPortDevice.ReadAsync();
            Assert.IsTrue(result.Data.Length > 0);
            var range = result.Data.ToList().GetRange(0, 10);
            Assert.IsFalse(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }.SequenceEqual(range));
        }
  <Capabilities>
    <Capability Name="internetClientServer" />
    <Capability Name="privateNetworkClientServer" />
    <DeviceCapability Name="serialcommunication">
      <Device Id="any">
        <Function Type="name:serialPort" />
      </Device>
    </DeviceCapability>
  </Capabilities>