2013-07-26 9 views
6

मैं वर्तमान में अपने जावा प्रोग्राम में सीरियल संचार को संभालने के लिए आरएफटीएक्स का उपयोग कर रहा हूं और मैं सफलतापूर्वक कनेक्ट/डिस्कनेक्ट और पढ़ने/लिखने में सक्षम हूं।जावा में डिवाइस द्वारा सीरियल पोर्ट बंद होने पर मुझे कैसे पता चलेगा?

हालांकि मैं यह पता लगाने में सक्षम नहीं हूं कि RXTX में कोई तरीका है या नहीं, यह पता लगाने के लिए कि कोई डिवाइस इसके अंत में डिस्कनेक्ट हो रहा है या नहीं। धारावाहिक बंदरगाहों को मतदान किए बिना आप इस घटना का पता कैसे लगाएंगे? चूंकि यह चुनावों के बीच डिस्कनेक्ट और रीकनेक्ट होता है, इसलिए यह पता नहीं लगाया जाएगा, लेकिन सीरियल पोर्ट का उपयोग होने पर त्रुटियों का कारण बनता है।

यदि आरXTएक्स में यह संभव नहीं है तो क्या कोई पुस्तकालय है जो एक डिस्कनेक्ट घटना का पता लगा सकता है?

स्पष्टीकरण: डिवाइस यूएसबी और रजिस्ट्रार से एक धारावाहिक डिवाइस के रूप में जुड़ा हुआ है। डिवाइस रीसेट या बंद होने पर डिवाइस डिस्कनेक्ट हो सकता है। जब यह धारावाहिक बंदरगाह को रीसेट करता है तो अस्थायी रूप से बंद कनेक्शन RXTX बनाया जाता है।

किसी भी मदद

+2

निर्भर करता है कि "डिस्कनेक्ट" से आपका क्या मतलब है। क्या आपका मतलब भौतिक रूप से/विद्युत है? इससे एक या अधिक लाइनों (डीसीडी, डीटीआर, डीएसआर, आरटीएस, सीटीएस) पर स्तर परिवर्तन हो सकता है, लेकिन यह कई चीजों पर निर्भर करेगा (यानी इनमें से कोई भी लाइन वास्तव में उपयोग की जा रही है, क्योंकि उनमें से कोई भी वास्तव में आवश्यक नहीं है)। मुझे दृढ़ता से संदेह है कि "डिस्कनेक्ट" की अवधारणा बीमार है, और सिद्धांत में यह पता लगाने योग्य नहीं हो सकता है जब तक कि आप भौतिक-परत प्रोटोकॉल का उपयोग नहीं कर रहे हैं जो कि इसके लिए प्रदान करता है (यानी डीसीडी) –

+0

जहां तक ​​मुझे पता है कि आपको मैन्युअल रूप से जांचना है या नहीं डिवाइस धारावाहिक बंदरगाह से जुड़ा हुआ है। –

उत्तर

1

के लिए धन्यवाद मैं एक ही समस्या है: मुझे पता है कि जब डिवाइस यूएसबी पोर्ट से अनप्लग था कोशिश कर रहा था। फिर, मुझे पता चला कि हर बार जब मैंने यूएसबी पोर्ट से डिवाइस को अनप्लग किया था, तो यह serialEvent से java.io.IOException प्राप्त करता है। नीचे मेरी serialEvent कोड पर एक नज़र डालें:

@Override 
public void serialEvent(SerialPortEvent evt) { 
    if(this.getConectado()){ 
     if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
     { 
      try {     
       byte singleData = (byte)input.read(); 

       if (singleData == START_DELIMITER) 
       { 
        singleData = (byte)input.read(); 
        if(singleData == (byte)0x00) 
        { 
         singleData = (byte)input.read(); //get the length 
         byte[] buffer = new byte[singleData+4]; 
         for(byte i=0x0;i<singleData;i++) 
          buffer[i+3] = (byte)input.read(); 
         buffer[buffer.length-1] = (byte)input.read(); 
         buffer[0] = START_DELIMITER; 
         buffer[1] = 0x00; 
         buffer[2] = singleData; //length 

         this.addNaLista(buffer); 

        } 
       } 
      } catch (IOException ex) { 
       Logger.getLogger(Comunicador.class.getName()).log(Level.SEVERE, null, ex); 
       /* do something here */ 
       //System.exit(1); 
      } 

     } 
    } 
} 

यहां तक ​​कि अगर मैं उस पल में डेटा प्राप्त नहीं कर रहा हूँ, मैं अभी भी java.io.IOException मिलता है, यहाँ अपवाद ट्रेस है:

Jun 21, 2014 10:57:19 AM inovale.serial.Comunicador serialEvent 
SEVERE: null 
java.io.IOException: No error in readByte 
at gnu.io.RXTXPort.readByte(Native Method) 
at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1250) 
at inovale.serial.Comunicador.serialEvent(Comunicador.java:336) 
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732) 
at gnu.io.RXTXPort.eventLoop(Native Method) 
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575) 

केवल घटनाओं मैं उपयोग कर रहा हूँ है:

serialPort.addEventListener(this); 
serialPort.notifyOnDataAvailable(true); 

इस तरह से मैं एक डिस्कनेक्ट (शारीरिक रूप से) घटना का पता लगाने के देखते हैं।

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