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.
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.quelle
Ich habe einen Weg gefunden, die
Serial
Klasse / das Objekt in Header-Dateien / Tabs zu deklarieren:Das fühlt sich für mich nicht besonders sauber an, aber es scheint noch keine Nachteile zu haben.
quelle