2012-08-27 16 views
14

यहां कोड है जो एक सीरियल पोर्ट से डेटा पढ़ता है। चीजों को सरल रखने के लिए, इसे बटन क्लिक पर करने दें; जब तक अपने लैपटॉप निष्क्रिय हो जाती हैसीरियल पोर्ट संचार त्रुटि, "अनुरोधित संसाधन उपयोग में है।"

private System.IO.Ports.SerialPort serialPort; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (serialPort == null) 
      serialPort = new SerialPort("COM7", 4800, Parity.None, 8, StopBits.One); 
      //COM7 is hard coded just for the sake of example 

     if (!serialPort.IsOpen) 
      serialPort.Open(); 

     textBox1.AppendText(serialPort.ReadExisting()); 
    } 

कोड बिल्कुल ठीक चलाता है। जब सिस्टम नींद से उठता है, serialPort ऑब्जेक्ट null नहीं है लेकिन serialPort.IsOpenfalse देता है और मुझे त्रुटि मिलती है, "अनुरोधित संसाधन उपयोग में है।" serialPort.Open() पर कॉल करते समय। आंतरिक अपवाद में कुछ भी नहीं है। enter image description here

मैं serialPort वस्तु, बंद करने निपटान या स्पष्ट रूप से यह शून्य पर बताए और आवश्कता है की तरह साथ बहुत सी बातें की कोशिश की है, लेकिन यह किसी काम का नहीं, एक ही लाइन पर एक ही त्रुटि हर बार की है।

 if (!serialPort.IsOpen) 
     { 
      try 
      { 
       serialPort.Open(); 
      } 
      catch 
      { 
       serialPort.Close(); 
       serialPort.Dispose(); 
       serialPort = null; 

       serialPort = new SerialPort("COM7", 4800, Parity.None, 8, StopBits.One); 
       serialPort.Open(); 
      } 
     } 

मैं भी serialPort.DataReceived घटना की कोशिश की है लेकिन गतिविधि सक्रिय नहीं है एक बार प्रणाली उठा-अप नींद से।

एकमात्र कामकाज एप्लिकेशन को रोकने और इसे फिर से चलाने के लिए है। अगर कोई मुझे सभ्य तरीके से हल करने के लिए कोई सुराग देता है तो मैं वास्तव में सराहना करता हूं।

+1

ठीक है जब आप सोने जा रहे हैं और फिर से शुरू करने के लिए फिर से खोलने का प्रयास कर सकते हैं तो आप कनेक्शन बंद करने का प्रयास कर सकते हैं। – Reniuz

+0

क्या आप वास्तविक धारावाहिक बंदरगाह या किसी प्रकार के पोर्ट इम्यूलेशन का उपयोग करते हैं? असली सीरियल पोर्ट पर इस कार्यक्रम को आजमाएं। –

+0

@AlexFarber यह एक वास्तविक सीरियल पोर्ट है, एक जीपीएस डिवाइस इससे जुड़ा हुआ है। – ABH

उत्तर

8

जैसा कि मैंने टिप्पणी में सुझाव दिया था कि सिस्टम को निलंबित होने के बारे में पता लगाने के लिए SystemEvents.PowerModeChanged ईवेंट का उपयोग करके कार्यवाही की जा सकती है। जब उस स्थिति का पता चला है तो आपको सीरियल पोर्ट को बंद करने और इसे फिर से खोलने की आवश्यकता है जब ऑपरेटिंग सिस्टम निलंबित राज्य से फिर से शुरू हो रहा है।

हामाद ने पुष्टि की कि यह कामकाज काम करता है।

यहां कोड है।

SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; 

void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) 
{ 
    if (e.Mode != PowerModes.Resume) 
     serialPort.Close(); 
} 

इसके अलावा घटना के दस्तावेज़ से ध्यान दें:

सावधानी

क्योंकि यह एक स्थिर घटना है, तो आप अपने ईवेंट हैंडलर्स को अलग करना होगा जब आपके आवेदन निपटान किया जाता है, या स्मृति रिसाव परिणाम होगा।

+0

मदद के लिए धन्यवाद :) – ABH

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