2009-09-08 10 views
6

this problem (किसी भी मदद की सराहना की गई) को समझने की कोशिश करते समय, मैंने PortMon का उपयोग करके अपनी गतिविधि की निगरानी करते हुए आरXTएक्स चलाया और देखा कि आरएफटीएक्स लगातार जांचता है कि डेटा उपलब्ध है, भले ही जावा क्लाइंट gnu.io.SerialPort ऑब्जेक्ट से पढ़ता है केवल एक SerialPortEventListener के माध्यम से।आरXTएक्स में निरंतर मतदान आवश्यक है?

यह क्यों है? क्या यह आरएफटीएक्स लोगों द्वारा खराब कार्यान्वयन विकल्प है, सूर्य द्वारा खराब एपीआई विकल्प (चूंकि आरXTएक्स javax.comm एपीआई का पालन करता है), या मूल कोड द्वारा समर्थित जावा चलाने की सीमा है?

दूसरी तरफ हाइपरटेरमिनल कोई मतदान नहीं करता (और किसी समस्या के बिना काम करता है)। क्या इसमें कुछ छिपी हुई विंडोज सिस्टम कॉलों तक पहुंच है जो इसे करने दें?

+1

RXTX का डिज़ाइन वांछित होने के लिए बहुत अधिक छोड़ देता है। आप मेरी वैकल्पिक लाइब्रेरी को देखना चाहेंगे: http://code.google.com/p/jperipheral/ – Gili

उत्तर

4

नहीं, यह javax.xomm एपीआई के कारण नहीं है। RXTx का उपयोग उस एपीआई के माध्यम से किया जा सकता है या नहीं।

आरएक्सएक्स आंतरिक कुछ अलग/अजीब हैं हालांकि कुछ बग हैं। लघु संस्करण, इस तरह यह काम करना चाहिए: आपके पास टाइमआउट और थ्रेसहोल्ड के साथ खेलने के लिए दो पैरामीटर हैं। स्रोत कोड के अनुसार टाइमआउट को 0 (कोई नहीं) और थ्रेसहोल्ड 1 पर सेट करना (लौटने से पहले कम से कम 1 बाइट की आवश्यकता होती है) हमें सामान्य रूप से इनपुट इनपुट द्वारा परिभाषित किया जाना चाहिए, पढ़ना अवरुद्ध करना।

समस्या यह है कि इसे स्थापित करते समय भी वर्तमान स्थिर रिलीज (2.1.7r2) में एक बग है। थ्रेसहोल्ड पैरामीटर हमेशा 0 पर सेट होता है! स्रोत कोड से:

/* टेस्टिंग ttyset.c_cc [VMIN] = दहलीज; */ ttyset.c_cc [VMIN] = 0;

भ्रमित करने वाला हिस्सा यह है कि यह 2004 में भी मामला था और मेलिंग सूची और निश्चित पर रिपोर्ट किया गया था, लेकिन यह या तो वास्तव में तय नहीं हुआ था या फिर वापस आ गया है (एक प्रतिगमन)। वास्तव में एक नई बग रिपोर्ट है कि किसी कारण से मुझे पहले नहीं मिला। अंत में मुझे यह पाया गया कि यह प्री-रिलीज पैकेज स्रोत कोड फेंक रहा है और अन्यथा प्रकाशित परिवर्तन लॉग नहीं मिला है (वेब ​​पेज अंतिम स्थिर संस्करण के बाद परिवर्तन लॉग नहीं दिखाता है, हालांकि यह सीवीएस में उपलब्ध है)।

समाधान

  1. यह सिर पर तय हो गई है, ताकि आप नवीनतम पूर्व-रिलीज़ संस्करण (2.2 सीरीज) का उपयोग करें या सीवीएस से यह संकलन कर सकते हैं।
  2. की तर्ज पर एक बदसूरत वैकल्पिक हल करें:

    int read(InputStream in) throws IOException { 
        int b; 
        while ((b=in.read()) == -1) { 
        try { Thread.sleep(10); } catch (InterruptedException e) { } 
        } 
        return b; 
    } 
    

तो फिर तुम कार्य करें: in.read() के बजाय read(in)

मैंने वास्तव में 212 साल पहले a blog entry about this लिखा था इसलिए मैं नहीं भूलूंगा।