2015-08-22 26 views
5

Tôi đang cố gắng triển khai ModBus master trên Windows 10 IoT trên Raspberry Pi 2. Tôi đang sử dụng một cổng USB bên ngoài để RS-232 bộ điều hợp từ bên trong cổng nối tiếp được dành riêng cho Kernel Debugging.Không thể sử dụng SerialDevice.ReadTimeout trong Windows 10 IoT

Cổng nối tiếp đang hoạt động. Câu hỏi của tôi chủ yếu là về thời gian chờ khi đọc.

Đây là mã của tôi:

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

Khi không có byte awailable tại đầu vào cổng RX sê-ri, tôi hy vọng các phương pháp LoadAsync trở về 0 sau chờ đợi. Thật không may, nó không bao giờ trở lại. (Ok, nó trở lại sau khi nhận được 256 byte, nhưng đó không phải là những gì tôi muốn)

Vì ModBus sử dụng hết thời gian chờ, tôi không chắc chắn làm thế nào để thực hiện nó. Tôi thậm chí không chắc chắn tôi có thể làm điều đó ...

Có ai đã sử dụng hết thời gian chờ trên Windows 10 cổng nối tiếp IoT không?

+0

Vâng, rõ ràng InputStreamOptions.Partial không hoạt động. Vì vậy, cuộn xúc xắc và thử InputStreamOptions.ReadAhead và None tiếp theo. –

Trả lời

4

Vâng, tôi cũng không thể làm việc này. Tôi không chắc chắn nơi nào ReadTimeout thực sự được sử dụng bởi lớp học SerialDevice nội bộ. Nhưng cuối cùng tôi đã nhận được một cái gì đó làm việc bằng cách sao chép thời gian chờ để một CancellationTokenSource.

Bạn có thể nhìn thấy nó được sử dụng trong ví dụ sau tôi đã viết cho một quy mô vận chuyển cũ Mettler Toledo PS 60 nối tiếp, trong đó device là một phiên bản SerialDevice. Dường như làm việc trong trường hợp của tôi, ít nhất.

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

Cảm ơn Nicholas. Tôi đã sử dụng một mã tương tự và nó hoạt động tốt cho tôi! Ít nhất chúng ta bây giờ có một cách để đọc byte với một thời gian chờ. – Ecorise

+0

Rực rỡ, cảm ơn! – AndrewJE

Các vấn đề liên quan