UWP SerialDevice只有在我读取它的属性时才有效

时间:2016-12-29 23:05:54

标签: c# serial-port uwp win-universal-app

所以,我有一些代码用于在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(); } 不再挂起,并且加载了字节。它有效,这很好,但为什么呢?

0 个答案:

没有答案