UWP串行端口访问-代码通常不';行不通
我正在使用标准的NMEA GPS设备。串行端口从设备读取数据,并将数据转换为可转换为纬度和经度的字符串。这是我正在使用的代码: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
[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>