Chiamare Serial.print in un file tab / header separato


9

Sto scrivendo un programma in Arduino 0022.

La chiamata Serial.printlnfunziona correttamente nel mio codice di schizzo principale, ma quando provo a usarlo nel mio file di intestazione " Menu.h", che si trova in una scheda separata, viene visualizzato un errore:

Nel file incluso da AppController.cpp: 2:
Menu.h: nel costruttore 'Menu :: Menu ()':
Menu.h: 15: errore: 'Seriale' non è stato dichiarato in questo ambito

Come posso usare Serial.printlnal di fuori del codice di schizzo?

Risposte:


3

Non si dovrebbero chiamare funzioni dall'interno dei file di intestazione. I file di intestazione servono per definire macro pre-processore (#define) e riferimenti a variabili / funzioni in altri file.

Dovresti creare più file C e collegarli insieme in fase di compilazione. Il file di intestazione viene utilizzato per indicare a ciascun file C quali funzioni e variabili hanno gli altri file C.

Per utilizzare più file nell'IDE di Arduino è necessario almeno 1 file di intestazione per descrivere le funzioni presenti negli altri file che si desidera condividere tra loro. Inoltre, tutte le variabili globali che si desidera utilizzare in tutti i file.

Queste definizioni devono essere qualificate con l'attributo "esterno".

Quindi è necessario aggiungere uno o più file "pde" che contiene il codice effettivo e le definizioni delle variabili per le funzioni.

Ad esempio, ho un file "mouse.h":

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

e un file "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);
}

Quindi nel mio file principale ho:

#include "mouse.h"

e posso chiamare le funzioni che si trovano in "mouse.pde" come se fossero nel file locale.


Grazie Majenko, la tua risposta mi è molto utile come programmatore C ++ alle prime armi, e adotterò sicuramente il tuo consiglio. Anche così, ero più interessato al motivo per cui la classe Seriale non è disponibile al di fuori del disegno principale. Saluti!
aaaidan,

3

In alternativa all'ottima risposta di @ Majenko, potresti creare una classe C ++ per incapsulare le tue funzioni e inserirla nella cartella delle librerie come descritto in http://www.arduino.cc/en/Hacking/LibraryTutorial .

Potrebbe essere necessario #include <Serial.h>nel file di implementazione della classe per poter chiamare i metodi seriali. Starei attento a fare questo thug in quanto ci sono ovviamente effetti collaterali nel chiamare le funzioni seriali (leggi in particolare). Preferisco definire un metodo nella mia classe che accetta un carattere * e passa i byte dall'interfaccia seriale al mio programma principale, piuttosto che farlo interagire direttamente con l'interfaccia seriale.


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

Ciao! Sì, ho dato un'occhiata nella directory della libreria arduino per Serial.h o simili, e tutto quello che ho potuto trovare era HardwareSerial.h, che non conteneva le definizioni di cui avevo bisogno. Alla fine mi sono imbattuto nella soluzione di includere <WProgram.h>, che sembra dichiarare l'oggetto seriale.
aaaidan,

0

Ho trovato un modo per far Serialdichiarare la classe / l'oggetto in file / schede di intestazione:

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

Questo non mi sembra molto pulito, ma non sembra avere ancora degli svantaggi.


1
Ah giusto, se vuoi assicurarti di essere compatibile con Arduino 1.0, dovresti includere condizionalmente quello o "Arduino.h" a seconda del flag di compilazione ARDUINO, vedi la mia risposta per un dettaglio. Inoltre, il link tutorial nella mia risposta dice di includere sempre WProgram.h nelle tue lezioni
vicatcu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.