Nie powinieneś wywoływać funkcji z plików nagłówkowych. Pliki nagłówkowe służą do definiowania makr preprocesorów (#define) i odniesień do zmiennych / funkcji w innych plikach.
Powinieneś tworzyć wiele plików C i łączyć je ze sobą podczas kompilacji. Plik nagłówkowy służy do informowania każdego pliku C, jakie funkcje i zmienne mają inne pliki C.
Aby używać wielu plików w Arduino IDE, potrzebujesz co najmniej 1 pliku nagłówka, aby opisać funkcje zawarte w innych plikach, które chcesz udostępnić między nimi. Ponadto wszelkie zmienne globalne, których chcesz używać we wszystkich plikach.
Definicje te należy zakwalifikować za pomocą atrybutu „zewnętrznego”.
Następnie musisz dodać jeden lub więcej plików „pde”, które zawierają rzeczywisty kod i definicje zmiennych dla funkcji.
Na przykład mam plik „mouse.h”:
extern void mouse_read(char *,char *, char *);
extern void mouse_init();
oraz plik „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);
}
Następnie w moim głównym pliku mam:
#include "mouse.h"
i mogę wywoływać funkcje znajdujące się w pliku „mouse.pde” tak, jakby były w pliku lokalnym.
Jako alternatywa dla bardzo dobrej odpowiedzi @ Majenko, możesz stworzyć klasę C ++ do enkapsulacji twoich funkcji i umieścić ją w folderze bibliotek, jak opisano w http://www.arduino.cc/en/Hacking/LibraryTutorial .
Może być konieczne
#include <Serial.h>
w pliku implementacyjnym klasy, aby móc wywoływać metody szeregowe. Byłbym ostrożny przy robieniu tego, ponieważ są oczywiście skutki uboczne wywoływania funkcji szeregowych (w szczególności czytaj). Wolę zdefiniować metodę w mojej klasie, która pobiera znak char * i przekazuje bajty z interfejsu szeregowego do niego z mojego programu głównego, zamiast bezpośredniego oddziaływania z interfejsem szeregowym.źródło
Znalazłem sposób na
Serial
zadeklarowanie klasy / obiektu w plikach / kartach nagłówków:Nie wydaje mi się to zbyt czyste, ale wydaje się, że nie ma jeszcze żadnych wad.
źródło