Wywołaj Serial.print w osobnym pliku tabu / nagłówka

9

Piszę program w Arduino 0022.

Wywołanie Serial.printlndziała dobrze w moim głównym kodzie szkicu, ale kiedy próbuję użyć go w pliku nagłówka „ Menu.h”, który znajduje się na osobnej karcie, pojawia się błąd:

W pliku zawartym w AppController.cpp: 2:
Menu.h: W konstruktorze „Menu :: Menu ()”:
Menu.h: 15: błąd: „Serial” nie został zadeklarowany w tym zakresie

Jak mogę używać Serial.printlnpoza kodem szkicu?

aaaidan
źródło

Odpowiedzi:

3

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.

Majenko
źródło
Dzięki Majenko, twoja odpowiedź jest bardzo pomocna dla mnie jako początkującego programisty C ++ i na pewno przyjmę twoją radę. Mimo to bardziej interesowało mnie, dlaczego klasa szeregowa nie jest dostępna poza głównym szkicem. Twoje zdrowie!
aaaidan
3

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.


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif
vicatcu
źródło
Cześć! Tak, rozejrzałem się w katalogu biblioteki arduino dla Serial.h lub podobnego, i wszystko, co mogłem znaleźć, to HardwareSerial.h, który nie zawierał potrzebnych definicji. W końcu natknąłem się na rozwiązanie z włączeniem <WProgram.h>, które zdaje się deklarować obiekt Serial.
aaaidan
0

Znalazłem sposób na Serialzadeklarowanie klasy / obiektu w plikach / kartach nagłówków:

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

Nie wydaje mi się to zbyt czyste, ale wydaje się, że nie ma jeszcze żadnych wad.

aaaidan
źródło
1
Ach, racja, jeśli chcesz się upewnić, że jesteś kompatybilny z Arduino 1.0, powinieneś warunkowo dołączyć to lub „Arduino.h” w zależności od flagi kompilacji ARDUINO. Zobacz moją odpowiedź po szczegóły. Ponadto link do samouczka w mojej odpowiedzi mówi, aby zawsze włączać WProgram.h do twoich zajęć
vicatcu