2012-04-19 13 views
12

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

संपादित करें:

कोड के साथ मैं काम कर रहा हूँ एक मोबाइल आवेदन के साथ बातचीत करने WiFly मॉड्यूल का उपयोग करता है, मैं Android का उपयोग कर मोबाइल अनुप्रयोग पर कुछ नियंत्रण के साथ एक रोबोट मॉड्यूल का निर्माण कर रहा हूँ। सब कुछ ठीक काम करता है, लेकिन कभी-कभी सॉकेट डिस्कनेक्ट हो जाता है, इसलिए मुझे ऐसे मामलों के लिए हैंडलिंग जोड़ने की ज़रूरत है, कुछ कोशिश/पकड़ ब्लॉक के समान है, लेकिन मुझे Arduino के लिए समान ब्लॉक नहीं मिला।

मेरे कोड:

void loop() { 
    Client client = server.available(); 
    if (client) { 
     while (client.connected()) { 
      if (client.available()) { 
       // Serial.print("client connected \n"); 
       char c = client.read(); 

       if(c == 'L') 
        turnLeft(); 
       if(c == 'R') 
        turnRight(); 
       if(c == 'F') 
        goForward(); 
       if(c == 'B') 
        goBackward(); 
       if(c == 'S') 
        Stop(); 

       Serial.print(c); 
      } 
     } 

     // give the web browser time to receive the data 
     delay(100); 
     client.stop(); 
    } 
} 
+0

आप हमें कुछ और जानकारी ... आप क्या कोशिश की है की तरह देने के लिए की जरूरत है, क्या आपको लगता है ... –

+0

मैंने अभी प्रश्न – NZal

उत्तर

17

Arduino reference is लिस्टिंग नहीं try catch (क्यों देखते हैं की जानकारी के लिए, उदाहरण के लिए, इस related answer)। और मुझे लगता है कि एक μ-नियंत्रक पर पकड़ने का प्रयास करना मुश्किल/असंभव हो सकता है।

अधिकांश भाषाओं में पकड़ने का प्रयास करना काफी महंगा ऑपरेशन है: प्रोग्राम स्टैक को ब्लॉक ब्लॉक के लिए और प्रत्येक कैच ब्लॉक के लिए एक बार कॉपी किया जाता है। यदि कोशिश गलत हो जाती है तो प्रयास-ब्लॉक स्टैक को त्याग दिया जाएगा और कैच ब्लॉक स्टैक में से एक को निष्पादित किया जाएगा।
मैं सीपीयू आर्किटेक्चर का विशेषज्ञ नहीं हूं, लेकिन मैं कल्पना कर सकता हूं कि इसे बहुत मेमोरी स्वैपिंग और इसी तरह के संचालन की आवश्यकता है - इसे सरल μ-नियंत्रक के साथ प्राप्त करना मुश्किल होना चाहिए।

संपादित
यह कैसे C-Programmers do patterns similar to try/catch

+0

अपडेट किया है इस उत्तर को देखें: http://stackoverflow.com/a/10586093/22470 – powtac

9

Arduino doesn't support exception handling देखने के लिए लायक हो सकता है। हालांकि, आपको अपना कोड मजबूत बनाने के लिए अपवाद हैंडलिंग का उपयोग करने की आवश्यकता नहीं है। केवल उन फ़ंक्शंस के रिटर्न मानों की जांच करके जो असफल हो सकते हैं, आप एक ही अंत प्राप्त कर सकते हैं।

client.connected() के बाद से पाश के आसपास हर बार चेक किया गया है, और client.available() के बाद से 0 वापस आ जाएगी, तो ही संभव विफलता है कि पहले से ही संभाला नहीं किया जा रहा client.read() से वापसी है जुड़ा हुआ नहीं।

आप इसे ठीक कर सकते हैं, उदाहरण के लिए, लाइन बदलकर:

char c = client.read(); 

रहे हैं:

int i = client.read(); 
if (i == -1) { 
    break; 
} 
char c = (char) i; 
+0

बहुत बहुत धन्यवाद! यह प्रबुद्ध था! – NZal

+0

:(कि त्रुटि प्रबंधन उपलब्ध नहीं है ... उल्लिखित वैकल्पिक "मजबूत वापसी मूल्य जांच" संदिग्ध है। कई कार्यों जैसे कि Serial.print कोई जानकारी नहीं देता है कि उन्होंने sucessfuly निष्पादित किया है। यह एक विकल्प है लेकिन वर्तमान में मैं हूं अभी भी अटक गया है कि मेरे स्कैच को राम से बाहर निकलने से दुर्घटनाग्रस्त होने से कैसे बचें क्योंकि Serial.print इसका डेटा नहीं निकाल रहा है! – humanityANDpeace

+0

एसआरएएम से बाहर चलना एक समस्या है जिसमें मुझे कई बार सामना करना पड़ा है और आप सही हैं इस प्रोग्रामेटिक रूप से जांचने का कोई अच्छा तरीका नहीं है। अक्सर इसका सबसे स्पष्ट लक्षण दूषित सीरियल आउटपुट होता है। अगर आप सिर्फ यह समझना चाहते हैं कि आपका स्केच मेमोरी का उपयोग कैसे कर रहा है तो आप मेमोरीफ्री लाइब्रेरी का उपयोग करके उपलब्ध एसआरएएम की मात्रा देख सकते हैं (सबसे आसान तरीका है MemplayFree.cpp कोड को http://playground.arduino.cc/Code/AvailableMemory से अपने स्केच में कॉपी करना और 'freeMemory() ') को कॉल करना। –