2015-08-22 14 views
5

Próbuję realizować Modbus Master w systemie Windows 10 IoT na Raspberry Pi 2. Używam zewnętrznego adapterem USB na RS-232 ponieważ wewnętrzny port szeregowy jest zarezerwowany do debugowania jądra.Nie można używać w systemie Windows 10 SerialDevice.ReadTimeout internetu przedmiotów

Port szeregowy działa. Moje pytanie dotyczy głównie czasu oczekiwania podczas czytania.

Oto mój kod:

// 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 

Bez bajtów awailable na wejściu portu szeregowego RX Czekam metodę LoadAsync powrotu 0 po czekać. Niestety, nigdy nie wraca. (OK, powraca po otrzymaniu 256 bajtów, ale to nie jest to, czego chcę)

Ponieważ ModBus intensywnie korzysta z limitów czasu, nie jestem pewien, jak go wdrożyć. Nie jestem nawet pewien, czy mógłbym to zrobić ...

Czy ktoś już korzystał z limitów czasu na portach szeregowych IoT systemu Windows 10?

+0

Cóż, wyraźnie nie działa InputStreamOptions.Partial. Rzuć kostką i wypróbuj InputStreamOptions.ReadAhead i None next. –

Odpowiedz

4

Tak, też nie mogłem tego zrobić. Nie jestem pewien, gdzie ReadTimeout jest używane wewnętrznie przez klasę. Ale w końcu udało mi się coś zrobić, kopiując limit czasu na CancellationTokenSource.

Możesz zobaczyć go w użyciu w poniższym przykładzie napisałem dla starej seryjnej skali wysyłki Mettler Toledo PS 60, gdzie device jest instancją SerialDevice. Wygląda na to, że przynajmniej w moim przypadku zadziała.

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

Dzięki Nicholas. Użyłem podobnego kodu i działa to również dla mnie! Przynajmniej mamy teraz sposób na odczyt bajtów z limitem czasu. – Ecorise

+0

Świetne, dzięki! – AndrewJE

Powiązane problemy