2015-08-22 24 views
5

Sto cercando di implementare un master Modbus su Windows 10 IoT su un Raspberry Pi 2. sto usando uno esterno adattatore da USB a RS-232 dal momento che il interna la porta seriale è riservata per il debug del kernel.Impossibile utilizzare SerialDevice.ReadTimeout in Windows 10 IoT

La porta seriale funziona. La mia domanda riguarda principalmente il timeout durante la lettura.

Ecco il mio codice:

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

Senza byte awailable all'ingresso porta RX di serie, mi aspetto il metodo LoadAsync per tornare a 0, un'attesa. Sfortunatamente, non ritorna mai. (OK, restituisce dopo 256 byte ricevuti, ma non è quello che voglio)

Poiché ModBus utilizza intensivamente i timeout, non sono sicuro di come implementarlo. Non sono nemmeno sicuro di poterlo fare ...

Qualcuno ha già utilizzato i timeout sulle porte seriali IoT di Windows 10?

+0

Bene, chiaramente InputStreamOptions.Partial non funziona. Quindi tira i dadi e prova InputStreamOptions.ReadAhead e None next. –

risposta

4

Sì, non sono riuscito a farlo funzionare. Non sono sicuro di dove ReadTimeout sia effettivamente utilizzato dalla classe SerialDevice internamente. Ma alla fine ho ottenuto qualcosa lavorando copiando il timeout su un CancellationTokenSource.

Potete vederlo in uso nel seguente esempio che ho scritto per una vecchia bilancia di spedizione seriale Mettler Toledo PS 60, dove device è un'istanza di SerialDevice. Sembra funzionare nel mio caso, almeno.

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

Grazie Nicholas. Ho usato un codice simile e funziona anche per me! Almeno ora abbiamo un modo per leggere i byte con un timeout. – Ecorise

+0

Brillante, grazie! – AndrewJE