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.