Ich wollte einen Teil meines Codes in eine zweite Registerkarte in der Arduino IDE verschieben, um die Dinge besser zu organisieren. Zuerst habe ich nur versucht, eine Funktion zu verschieben, und es schien gut zu funktionieren. Ich konnte die Funktion über die setup()
Funktion in meiner Hauptregisterkarte aufrufen , und es gab keine Probleme beim Kompilieren oder Hochladen.
Ich habe jedoch versucht, eine ganze Klasse in die zweite Registerkarte zu stellen, und plötzlich hat es nicht mehr funktioniert. Beispielsweise:
Tab 1:
TestClass obj;
void setup()
{
obj.init();
}
void loop()
{
//...
}
Tab 2:
class TestClass
{
public:
void init()
{
//...
}
};
Als ich versuchte, dies zu kompilieren, ergaben sich folgende Fehler:
tab1:1: error: 'TestClass' does not name a type
tab1.ino: In function 'void setup()':
tab1:5: error: 'obj' was not declared in this scope
Warum erkennt es eine Funktion in einer anderen Registerkarte, aber keine Klasse? Gibt es eine Möglichkeit, es in der Arduino IDE zum Laufen zu bringen, oder muss ich eine Alternative wie Eclipse verwenden?
quelle
#include
?tab1
undtab2
jeweils. Die Namen wurden mithilfe der IDE festgelegt, sodass die zugrunde liegenden Dateien beide sind.ino
.Antworten:
Es ist nicht möglich, Klassen, die in einer
.pde
Datei deklariert wurden, in einer anderen.pde
Datei in der Arduino IDE zu deklarieren und zu verwenden .Eine Problemumgehung besteht darin, die zweite Datei in eine C ++ - Quelldatei (
.cpp
) umzuwandeln und dann#include "<filename>"
am Anfang der ersten Datei eine Direktive hinzuzufügen .Dieser Code wird korrekt kompiliert:
Tab 1:
test.cpp:
quelle
TestClass::init()
versucht wird, aufzurufenpinMode()
, beschwert sich der Compiler, derpinMode
in diesem Bereich nicht deklariert wurde. Gibt es eine Möglichkeit, auf die Arduino-Funktionen in meiner Klasse zuzugreifen?#include <Arduino.h>
am Anfang der.cpp
Datei hinzu.#include "test.cpp"
). Es funktioniert, kann aber das Verständnis des Verknüpfungsprozesses beeinträchtigen. Es sollten nur Header-Dateien enthalten sein.Die Arbeitsweise der Arduino IDE besteht darin, dass sie Ihren Code (den Code, den Sie in die IDE schreiben) als "Hauptcode" kompiliert. Anschließend wird Code aus allen von Ihnen importierten Bibliotheken abgerufen und zusammen mit dem Hauptcode kompiliert. Um das zu tun, was Sie vorschlagen, müssen Sie eine Bibliothek für Arduino erstellen.
Hier finden Sie weitere Informationen zu Arduino-Bibliotheken:
http://arduino.cc/en/Guide/Libraries
Und hier einige Hinweise zum Erstellen einer Bibliothek:
http://arduino.cc/de/Hacking/LibraryTutorial // dieses ist das am einfachsten zu verstehende imo
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ schreibe deine eigene Arduino-Bibliothek.html #
Hier ist eine Beispielbibliothek, die ich geschrieben habe: https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister Wie Sie sehen, gibt es kein Problem beim Aufrufen von Arduino-Funktionen aus der .cpp-Datei (ich weiß, ich habe Bibliothek getestet)
quelle
.h
und.cpp
Dateien in Ihrem Hauptprojekt, ohne dass eine separate Bibliothek erstellen zu müssen.