No debería llamar a funciones desde archivos de encabezado. Los archivos de encabezado son para definir macros preprocesadores (#define) y referencias a variables / funciones en otros archivos.
Debería crear varios archivos C y vincularlos en tiempo de compilación. El archivo de encabezado se utiliza para indicar a cada archivo C qué funciones y variables tienen los otros archivos C.
Para usar varios archivos en el IDE de Arduino, necesita al menos 1 archivo de encabezado para describir las funciones que están en los otros archivos que desea compartir entre ellos. Además, cualquier variable global que desee utilizar en todos los archivos.
Estas definiciones deben calificarse con el atributo "externo".
Luego debe agregar uno o más archivos "pde" que contienen el código real y las definiciones de variables para las funciones.
Por ejemplo, tengo un archivo "mouse.h":
extern void mouse_read(char *,char *, char *);
extern void mouse_init();
y un archivo "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);
}
Luego en mi archivo principal tengo:
#include "mouse.h"
y puedo llamar a las funciones que están en "mouse.pde" como si estuvieran en el archivo local.
Como alternativa a la muy buena respuesta de @ Majenko, puede hacer una clase de C ++ para encapsular sus funciones y ponerla en la carpeta de bibliotecas como se describe en http://www.arduino.cc/en/Hacking/LibraryTutorial .
Es posible que necesite
#include <Serial.h>
en el archivo de implementación de su clase para poder llamar a los métodos en serie. Tendría cuidado al hacer esto ya que obviamente hay efectos secundarios al llamar a las funciones en serie (leer en particular). Prefiero definir un método en mi clase que tome un char * y pase bytes desde la interfaz en serie desde mi programa principal, en lugar de hacer que interactúe con la interfaz en serie directamente.fuente
Encontré una manera de
Serial
declarar la clase / objeto en los archivos / pestañas de encabezado:Esto no me parece súper limpio, pero todavía no parece tener inconvenientes.
fuente