所以,我有一些代码用于在UWP中设置我的串口(用于USB转串口适配器):
{
"name":"foo",
"bars":[
{
"name":"bar1"
},
{
"name":"bar2"
},
{
"name":"bar3"
}
]
}
现在,在代码的后面某处,我从SerialDevice读取了一个流:
public async Task Init()
{
string qFilter = SerialDevice.GetDeviceSelector("COM5");
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(qFilter);
deviceId = devices.First().Id;
var serialPort = await SerialDevice.FromIdAsync(deviceId);
serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.BaudRate = 4800;
serialPort.Parity = SerialParity.None;
serialPort.StopBits = SerialStopBitCount.One;
serialPort.DataBits = 8;
serialPort.Handshake = SerialHandshake.None;
}
最后一行没有上面的代码挂起,据我所知,串口设备正在向串口发送字节。
有趣的是,当我在设置部分(第一个片段)上设置断点时,它可以工作。但是如果没有断点并踩过它,它就会挂起或者超时。
通过试验和错误,我发现,读取我在设置代码中设置的串行设备属性,使它神奇地工作。
所以在第一段代码中,我添加了:
public async Task<string> ReadValueFromSerial()
{
var dataReaderObject = new DataReader(serialPort.InputStream);
uint ReadBufferLength = 1024;
dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
CancellationTokenSource cts = new CancellationTokenSource();
//set timeout here.
cts.CancelAfter(10000);
var bytesRead = await dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cts.Token);
(...)
}
现在public async Task Init()
{
(...)
var s1 = " " + serialPort.BaudRate;
var s2 = " " + serialPort.DataBits;
var s3 = " " + serialPort.Parity.ToString();
}
不再挂起,并且加载了字节。它有效,这很好,但为什么呢?