एक अलग टैब / हेडर फ़ाइल में Serial.print को कॉल करें


9

मैं Arduino 0022 में एक कार्यक्रम लिख रहा हूं।

कॉलिंग Serial.printlnमेरे मुख्य स्केच कोड में ठीक काम करता है, लेकिन जब मैं इसे अपनी हेडर फ़ाइल " Menu.h" में उपयोग करने का प्रयास करता हूं , जो कि एक अलग टैब में है, तो मुझे एक त्रुटि मिलती है:

AppController.cpp से शामिल फ़ाइल में: 2:
Menu.h: कंस्ट्रक्टर में 'मेनू :: मेनू ()':
Menu.h: 15: त्रुटि: 'सीरियल' इस दायरे में घोषित नहीं किया गया था

मैं Serial.printlnस्केच कोड के बाहर कैसे उपयोग कर सकता हूं ?

जवाबों:


3

आपको हेडर फ़ाइलों के भीतर से फ़ंक्शन कॉल नहीं करना चाहिए। हेडर फाइलें प्री-प्रोसेसर मैक्रोज़ (#define) को परिभाषित करने और अन्य फाइलों में चर / कार्यों के संदर्भ में हैं।

आपको कई सी फाइलें बनानी चाहिए और उन्हें संकलन समय पर एक साथ जोड़ना चाहिए। हेडर फाइल का उपयोग प्रत्येक सी फाइल को यह बताने के लिए किया जाता है कि अन्य सी फाइलों के क्या कार्य और चर हैं।

Arduino IDE में कई फ़ाइलों का उपयोग करने के लिए, आपको उन फ़ाइलों का वर्णन करने के लिए कम से कम 1 हेडर फ़ाइल की आवश्यकता होती है जो अन्य फ़ाइलों में हैं जो आप उनके बीच साझा करना चाहते हैं। इसके अलावा, कोई भी वैश्विक चर जिसे आप सभी फ़ाइलों में उपयोग करना चाहते हैं।

इन परिभाषाओं को "बाहरी" विशेषता के साथ योग्य होना चाहिए।

फिर आपको एक या एक से अधिक "pde" फ़ाइल जोड़ने की आवश्यकता है जिसमें कार्यों के लिए वास्तविक कोड और चर परिभाषाएं हैं।

उदाहरण के लिए, मेरे पास "mouse.h" फ़ाइल है:

extern void mouse_read(char *,char *, char *);
extern void mouse_init();

और एक "mouse.pde" फ़ाइल:

#include <ps2.h>

PS2 mouse(6,5);

void mouse_read(char *stat,char *x, char *y)
{
  mouse.write(0xeb);  // give me data!
  mouse.read();      // ignore ack
  *stat = mouse.read();
  *x = mouse.read();
  *y = mouse.read();
}

void mouse_init()
{
  mouse.write(0xff);  // reset
  mouse.read();  // ack byte
  mouse.read();  // blank */
  mouse.read();  // blank */
  mouse.write(0xf0);  // remote mode
  mouse.read();  // ack
  delayMicroseconds(100);
}

फिर मेरी मुख्य फाइल में मेरे पास है:

#include "mouse.h"

और मैं "mouse.pde" में होने वाले फ़ंक्शन को कॉल कर सकता हूं जैसे कि वे स्थानीय फ़ाइल में थे।


धन्यवाद मैज़ेंको, आपका जवाब मेरे लिए एक नौसिखिया सी ++ कोडर के रूप में बहुत उपयोगी है, और मैं निश्चित रूप से आपकी सलाह को अपनाऊंगा। फिर भी, मुझे इस बात में अधिक दिलचस्पी थी कि सीरियल वर्ग मुख्य स्केच के बाहर क्यों उपलब्ध नहीं है। चीयर्स!
आअदन २३'११

3

@ माजेंको के बहुत अच्छे जवाब के विकल्प के रूप में, आप अपने कार्यों को इनकैप्सुलेट करने के लिए एक सी ++ क्लास बना सकते हैं और इसे लाइब्रेरियन फ़ोल्डर में डाल सकते हैं जैसा कि http://www.arduino.cc/en/Hacking/LibraryTutorial में वर्णित है ।

आपको #include <Serial.h>अपनी कक्षा की कार्यान्वयन फ़ाइल में सीरियल विधियों को कॉल करने में सक्षम होने की आवश्यकता हो सकती है । मैं इस तू को करने के बारे में सावधान रहूंगा क्योंकि स्पष्ट रूप से सीरियल फ़ंक्शन (विशेष रूप से पढ़ें) को कॉल करने के साइड इफेक्ट्स हैं। मैं अपनी कक्षा में एक विधि को परिभाषित करना पसंद करता हूं जो एक चार * लेता है और धारावाहिक इंटरफ़ेस से मेरे मुख्य कार्यक्रम से बाइट्स पास करता है, बजाय इसके कि यह सीधे सीरियल इंटरफ़ेस के साथ इंटरैक्ट करता है।


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

नमस्ते! हाँ, मैं Serial.h या इसी तरह के लिए arduino पुस्तकालय निर्देशिका में चारों ओर एक नज़र था, और सभी मुझे मिल सकता था HardwareSerial.h, जिसमें मेरी ज़रूरत की परिभाषाएँ शामिल नहीं थीं। अंत में मैं <WProgram.h> सहित समाधान पर ठोकर खाई, जो कि सीरियल ऑब्जेक्ट घोषित करने के लिए लगता है।
आअदन २३'११

0

मुझे Serialहेडर फ़ाइलों / टैब में घोषित क्लास / ऑब्जेक्ट को प्राप्त करने का एक तरीका मिला :

#include <WProgram.h>  // at the top of the file

यह मेरे लिए सुपर साफ महसूस नहीं करता है, लेकिन यह अभी तक कोई कमियां नहीं है।


1
आह ठीक है, अगर आप यह सुनिश्चित करना चाहते हैं कि आप Arduino 1.0 संगत हैं, तो आपको सशर्त रूप से उस या "Arduino.h" को शामिल करना चाहिए जो ARDUINO संकलन ध्वज के आधार पर एक विवरण के लिए मेरा उत्तर देखें। इसके अलावा, मेरे उत्तर में ट्यूटोरियल लिंक हमेशा अपनी कक्षाओं में WProgram.h को शामिल करने के लिए कहता है
vicatcu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.