Rufen Sie Serial.print in einer separaten Tab / Header-Datei auf

9

Ich schreibe ein Programm in Arduino 0022.

Das Aufrufen Serial.printlnfunktioniert in meinem Hauptskizzencode einwandfrei, aber wenn ich versuche, es in meiner Header-Datei " Menu.h" zu verwenden, die sich auf einer separaten Registerkarte befindet, wird folgende Fehlermeldung angezeigt:

In der von AppController.cpp enthaltenen Datei: 2:
Menu.h: Im Konstruktor 'Menu :: Menu ()':
Menu.h: 15: Fehler: 'Serial' wurde in diesem Bereich nicht deklariert

Wie kann ich Serial.printlnaußerhalb des Skizzencodes verwenden?

aaaidan
quelle

Antworten:

3

Sie sollten keine Funktionen aus Header-Dateien heraus aufrufen. Header-Dateien dienen zum Definieren von Präprozessor-Makros (#define) und Verweisen auf Variablen / Funktionen in anderen Dateien.

Sie sollten mehrere C-Dateien erstellen und diese beim Kompilieren miteinander verknüpfen. Die Header-Datei wird verwendet, um jeder C-Datei mitzuteilen, welche Funktionen und Variablen die anderen C-Dateien haben.

Um mehrere Dateien in der Arduino IDE zu verwenden, benötigen Sie mindestens eine Header-Datei, um die Funktionen in den anderen Dateien zu beschreiben, die Sie zwischen ihnen teilen möchten. Außerdem alle globalen Variablen, die Sie für alle Dateien verwenden möchten.

Diese Definitionen sollten mit dem Attribut "extern" qualifiziert werden.

Dann müssen Sie eine oder mehrere "pde" -Dateien hinzufügen, die den tatsächlichen Code und die Variablendefinitionen für die Funktionen enthalten.

Zum Beispiel habe ich eine "mouse.h" -Datei:

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

und eine "mouse.pde" -Datei:

#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);
}

Dann habe ich in meiner Hauptdatei:

#include "mouse.h"

und ich kann die Funktionen in "mouse.pde" so aufrufen, als wären sie in der lokalen Datei.

Majenko
quelle
Vielen Dank, Majenko. Ihre Antwort ist für mich als unerfahrener C ++ - Codierer sehr hilfreich, und ich werde Ihren Rat auf jeden Fall annehmen. Trotzdem interessierte mich mehr, warum die Serienklasse außerhalb der Hauptskizze nicht verfügbar ist. Prost!
aaaidan
3

Als Alternative zu der sehr guten Antwort von @ Majenko können Sie eine C ++ - Klasse erstellen, um Ihre Funktionen zu kapseln und in den Bibliotheksordner zu legen, wie unter http://www.arduino.cc/en/Hacking/LibraryTutorial beschrieben .

Möglicherweise müssen Sie #include <Serial.h>in der Implementierungsdatei Ihrer Klasse serielle Methoden aufrufen. Ich würde vorsichtig sein, da dies offensichtlich Nebenwirkungen beim Aufrufen von seriellen Funktionen hat (insbesondere lesen). Ich bevorzuge es, in meiner Klasse eine Methode zu definieren, die ein Zeichen * verwendet und Bytes von der seriellen Schnittstelle von meinem Hauptprogramm an dieses übergibt, anstatt es direkt mit der seriellen Schnittstelle interagieren zu lassen.


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif
vicatcu
quelle
Hallo! Ja, ich habe mich im Arduino-Bibliotheksverzeichnis nach Serial.h oder ähnlichem umgesehen und alles, was ich finden konnte, war HardwareSerial.h, das nicht die Definitionen enthielt, die ich brauchte. Am Ende bin ich auf die Lösung gestoßen, <WProgram.h> einzuschließen, das das serielle Objekt zu deklarieren scheint.
aaaidan
0

Ich habe einen Weg gefunden, die SerialKlasse / das Objekt in Header-Dateien / Tabs zu deklarieren:

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

Das fühlt sich für mich nicht besonders sauber an, aber es scheint noch keine Nachteile zu haben.

aaaidan
quelle
1
Ah richtig, wenn Sie sicherstellen möchten, dass Sie Arduino 1.0-kompatibel sind, sollten Sie dies oder "Arduino.h" abhängig vom ARDUINO-Kompilierungsflag unter bestimmten Bedingungen einschließen. Weitere Informationen finden Sie in meiner Antwort. Außerdem sagt der Tutorial-Link in meiner Antwort, dass WProgram.h immer in Ihren Klassen enthalten sein soll
vicatcu