2011-01-11 2 views
5

में पूर्ण सीरियल पोर्ट डेटा नहीं पढ़ रहा है। मैं नेट फ्रेमवर्क 4 का उपयोग कर रहा हूं और सी # में सीरियल पोर्ट जीयूआई एप्लीकेशन बना रहा हूं। कुछ मामलों में, serialport वस्तु (बंदरगाह) सभी डेटा प्राप्त नहीं होता है (मैं एक मिश्रित सिग्नल आस्टसीलस्कप के साथ तुलना)सी #

उदाहरण के लिए, कनेक्ट किए गए डिवाइस भेजता है:

0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09

मैं प्राप्त कर सकते हैं:

0x00 0x01 0x02 0x03 0x04 0x08 0x09

मैं अलग ही समस्या आ कोड की कोशिश की:

  • डेटा एक बफर को भरने के लिए प्राप्त घटना का उपयोग करें:

     while (port.BytesToRead < expectedSize) 
        { 
         System.Threading.Thread.Sleep(10); 
         waitingLoop++; 
         if (waitingLoop > TimeOut)    // wait for a 1s timeout 
          throw new TimeoutException(); 
        } 
    
        newBytes = new byte[expectedSize]; 
        LengthRead = port.Read(newBytes, 0, newBytes.Length); 
        if (LengthRead != newBytes.Length) 
         throw new TimeoutException(); // or any exception, doesn't matter... 
    

: TimeoutException के कारण इस मामले में,

private void dataReceived(object sender, SerialDataReceivedEventArgs e) { 
     while (port.BytesToRead > 0){ 
      byte[] newBytes = new byte[port.BytesToRead]; 
      int LengthRead = port.Read(newBytes, 0, newBytes.Length); 
      Array.Resize(ref newBytes, LengthRead); 
      System.Buffer.BlockCopy(newBytes, 0, buffer, positionInBuffer, newBytes.Length); 
      positionInBuffer += newBytes.Length; 
     } 
    } 
  • बाइट्स की एक अपेक्षित संख्या के लिए लूपिंग मैंने रीडबफर आकार आकार, टाइमआउट जानकारी बदलने की कोशिश की ... लेकिन कुछ भी काम नहीं करता है। कोई विचार? सॉफ्टवेयर (Xon/XOF) कॉन्फ़िगर

  • उत्तर

    2

    कोशिश करने के लिए या हार्डवेयर (जैसे आरटीएस/सीटीएस) हेन्डशेकिंग सीरियल पोर्ट पर, उपकरण है, जो संचारित हो के विन्यास मैच के लिए।

    3

    इस कोड में सूक्ष्म गलतियों रहे हैं। पहला स्निपेट का ऐरे। रीसाइज() कुछ भी नहीं करता है, शायद बफर इसके बजाय आकार बदलने की आवश्यकता है? एक TimeoutException पर दूसरा टुकड़ा बम जब अधिक बाइट्स expectedSize से प्राप्त हुए थे। जो निश्चित रूप से संभव है और समय-समय पर समस्या नहीं है।

    लेकिन मुझे लगता है वास्तविक समस्या क्या आप इस कोड के बाहर सरणी के साथ क्या है। सामान्य रूप से, SerialPort.Read() को कॉल करने से आपको केवल कुछ बाइट मिलते हैं। सीरियल बंदरगाह धीमी हैं। आपको 'पूर्ण' प्रतिक्रिया प्राप्त होने पर जानने के लिए किसी प्रकार का प्रोटोकॉल चाहिए। एक बहुत आम (गैर-बाइनरी) एक लाइन-फीड के साथ प्रतिक्रिया को समाप्त कर रहा है। फिर आप DataReceived ईवेंट हैंडलर में केवल ReadLine() का उपयोग करेंगे। यह स्पष्ट नहीं है कि आपके मामले में उचित दृष्टिकोण क्या होगा।

    इसके अलावा ErrorReceived घटना को लागू। यह आपको बताएगा कि कुछ बुरा हुआ, जैसे SerialError.Overrun या RXOver, त्रुटियां जो बाइट्स को गायब कर देती हैं।

    +0

    आप सही थे, कुछ बुरा हुआ क्योंकि मुझे SerialError.Overrun मिला। यदि मैं सही ढंग से समझता हूं, तो यह त्रुटि एक हार्डवेयर ओवररन है, है ना? जो द्वारा प्रस्तावित हैंडशेकिंग इस तरह के मुद्दे को हल करने में मेरी मदद कर सकती है? मैं यूएसबी में आरएस 232 (एचडब्लू फ्लो कंट्रोल लाइनों के बिना) को परिवर्तित करने के लिए एफटीडीआई चिप का उपयोग कर रहा हूं लेकिन मुझे यकीन नहीं है कि मैं उस मामले में एसडब्ल्यू फ्लो कंट्रोल का सही ढंग से उपयोग कर सकता हूं। – mgross

    +0

    नहीं, यह एक नरम ओवररन है, बफर अतिप्रवाह है। आधुनिक मशीनों पर उल्लेखनीय, जब तक आप डिबगिंग नहीं कर लेते। ReadBufferSize बढ़ाएं, अनुरोध करने के लिए हैंडशेक सेट करें। बाद वाले को डिवाइस को हैंडशेकिंग को लागू करने की आवश्यकता होती है, अधिकांश करते हैं। –

    +0

    ReadBufferSize वर्तमान में 4096 पर सेट है और जब मेरा टाइमआउट अपवाद बंदरगाह आता है बाइट्स टॉरेड वर्तमान में << ~ 800 है। मैंने हैंडशेक को अनुरोध करने के लिए सेट करने की भी कोशिश की लेकिन यह बिल्कुल संवाद नहीं करता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि कंप्यूटर डेटा मांगता है लेकिन मेरे पास हार्डवेयर फ्लो कंट्रोल लाइन कनेक्ट नहीं है, है ना? – mgross

    0

    उत्तर के लिए धन्यवाद।

    असल में मैं धारावाहिक डेटा में प्रोटोकॉल के कुछ प्रकार है। यह कुछ की तरह है:

    <ID><SIZE><DATA....><CHECKSUM> 
    

    मैं आमतौर पर सही ढंग से पहचान पत्र, आकार और फिर मैं उम्मीद 'आकार' डेटा बाइट्स के लिए सुन (आकार कम से कम 1000 है और सीरियल पोर्ट 115200 पर चल रहा है, तो यह होना चाहिए थोडा समय)। लेकिन जब मैं उनके लिए इंतजार करता हूं, उदाहरण के लिए दूसरे कोड (प्रतीक्षा लूप) के साथ, वे कभी भी मेरे सी # कोड पर नहीं आते हैं, भले ही वे वास्तव में सीरियल लाइन (दायरे के साथ चेक किए गए) पर विचार कर रहे हों।अभी भी दूसरा कोड चला रहा है, मुझे पहली टाइमऑटएक्सप्शन (प्रतीक्षा लूप पर) मिला है जिसका अर्थ है कि मुझे 1s के भीतर सभी डेटा प्राप्त नहीं होते हैं (5s तक बढ़ने की भी कोशिश की जाती है)। तो SerialPort.Read() फ़ंक्शन पर जाने से पहले त्रुटि पकड़ ली जाती है।

    वैसे भी, मैं ErrorReceived घटना के लिए) की जाँच करता है, तो मैं कुछ को पकड़ने की जाँच करने के होगा ...

    Array.Resize (के बारे में

    मैं मामले में यह लिखा SerialPort.Read() के दिए गए डेटा कम बाइट्स है अपेक्षित लोगों की तुलना में। बफर मेरे सीरियलपोर्ट बफर (40 9 6) के अधिकतम आकार पर पूर्व आकार का है। कोड में मेरी दूसरी गलती के बारे में आप सही तरीके से सही हैं। मुझे बेहतर अपवाद का बेहतर उपयोग करना चाहिए :)