2015-08-22 58 views
5

我試圖實現Modbus主在Windows 10物聯網在樹莓派2 我使用一個外部USB轉RS-232適配器由於內部串行端口保留用於內核調試。無法在Windows 10使用SerialDevice.ReadTimeout物聯網

串口工作正常。我的問題主要是閱讀時超時。

這裏是我的代碼:

// Initialization 
serialDevice.ReadTimeout = new TimeSpan(0, 0, 0, allowedTimeBetweenBytes); 
serialDataReader.InputStreamOptions = InputStreamOptions.Partial; 

// Reading 
uint bytesRead = await serialDataReader.LoadAsync(MaxBufferSize); // 256 
// Now use ReadBytes to get actual bytes 

由於沒有字節awailable在串行端口RX輸入,我期待的LoadAsync方法等待後返回0。不幸的是,它永遠不會返回(好吧,它收到256字節後返回,但這不是我想要的)

由於ModBus密集使用超時,我不知道如何實現它。我甚至不確定我能做到這些...

有沒有人已經在Windows 10物聯網串行端口上使用超時?

+0

那麼,顯然InputStreamOptions.Partial不起作用。所以滾動骰子,然後嘗試InputStreamOptions.ReadAhead和None。 –

回答

4

是的,我也無法得到這個工作。我不確定ReadTimeout在內部實際上是由SerialDevice類使用的。但我最終通過將暫停時間複製到CancellationTokenSource來完成某些工作。

您可以在以下示例中看到它的使用情況,該示例是我爲舊的序列號Mettler Toledo PS 60裝運比例編寫的,其中deviceSerialDevice的實例。似乎至少在我的情況下工作。

using (var writer = new DataWriter(device.OutputStream)) 
{ 
    writer.WriteString("W\r\n"); 

    using (var cts = new CancellationTokenSource(device.WriteTimeout)) 
    { 
     await writer.StoreAsync().AsTask(cts.Token); 
    } 

    writer.DetachStream(); 
} 

using (var reader = new DataReader(device.InputStream)) 
{ 
    using (var cts = new CancellationTokenSource(device.ReadTimeout)) 
    { 
     var read = await reader.LoadAsync(12).AsTask(cts.Token); 

     if (read >= 12) 
     { 
      var data = reader.ReadString(12); 
      reader.DetachStream(); 

      return ExtractWeightChangedEventArgs(data); 
     } 
    } 
} 
+0

謝謝尼古拉斯。我使用了類似的代碼,對我來說也很好!至少我們現在有一種方法來讀取超時的字節。 – Ecorise

+0

輝煌,謝謝! – AndrewJE