IoT

2015-08-22 16 views
5

मैं Windows 10 IoT पर एक Modbus मास्टर लागू करने के लिए एक रास्पबेरी Pi पर 2. मैं आंतरिक के बाद से 232 रुपये एडाप्टर के लिए एक बाहरी यूएसबी उपयोग कर रहा हूँ कोशिश कर रहा हूँ Windows 10 में SerialDevice.ReadTimeout उपयोग करने में असमर्थ सीरियल पोर्ट कर्नेल डीबगिंग के लिए आरक्षित है।IoT

सीरियल पोर्ट काम कर रहा है। मेरा प्रश्न मुख्य रूप से पढ़ते समय टाइमआउट के बारे में है।

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

कोई बाइट्स के साथ, सीरियल पोर्ट RX इनपुट पर awailable मैं इंतजार के बाद वापस जाने के लिए 0 LoadAsync विधि की उम्मीद कर रहा हूँ:

यहाँ मेरी कोड है। दुर्भाग्य से, यह कभी वापस नहीं आता है। (ठीक है, यह 256 बाइट प्राप्त होने के बाद वापस आता है, लेकिन यह वही नहीं है जो मुझे चाहिए)

चूंकि मॉडबस समय-समय पर उपयोग करने का उपयोग करता है, मुझे यकीन नहीं है कि इसे कैसे कार्यान्वित किया जाए। मुझे यह भी यकीन नहीं है कि मैं इसे कर सकता हूं ...

क्या कोई भी पहले से ही विंडोज 10 आईओटी सीरियल पोर्ट पर टाइमआउट का उपयोग करता है?

+0

ठीक है, स्पष्ट रूप से इनपुटस्ट्रीमऑप्शन। पार्टियल काम नहीं कर रहा है। तो पासा रोल करें और इनपुटस्ट्रीमऑप्शन की कोशिश करें। आगे और आगे कोई नहीं। –

उत्तर

4

हाँ, मैं यह काम नहीं कर सका। मुझे यकीन नहीं है कि ReadTimeout वास्तव में SerialDevice कक्षा द्वारा आंतरिक रूप से उपयोग किया जाता है। लेकिन मैंने टाइमआउट को CancellationTokenSource पर कॉपी करके कुछ काम करना समाप्त कर दिया।

आप इसे पुराने उदाहरण के मेटलर टोलेडो पीएस 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

संबंधित मुद्दे