Llame a Serial.print en una pestaña / archivo de encabezado separado

9

Estoy escribiendo un programa en Arduino 0022.

Las llamadas Serial.printlnfuncionan bien en mi código de boceto principal, pero cuando intento usarlo en mi archivo de encabezado " Menu.h", que está en una pestaña separada, aparece un error:

En el archivo incluido desde AppController.cpp: 2:
Menu.h: En el constructor 'Menú :: Menú ()':
Menú.h: 15: error: 'Serie' no se declaró en este ámbito

¿Cómo puedo usar Serial.printlnfuera del código de boceto?

aaaidan
fuente

Respuestas:

3

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.

Majenko
fuente
Gracias Majenko, su respuesta es muy útil para mí como codificador novato de C ++, y definitivamente adoptaré sus consejos. Aun así, estaba más interesado en por qué la clase Serial no está disponible fuera del boceto principal. ¡Salud!
aaaidan
3

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.


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif
vicatcu
fuente
¡Hola! Sí, eché un vistazo en el directorio de la biblioteca arduino para Serial.h o similar, y todo lo que pude encontrar fue HardwareSerial.h, que no contenía las definiciones que necesitaba. Al final me topé con la solución de incluir <WProgram.h>, que parece declarar el objeto Serie.
aaaidan
0

Encontré una manera de Serialdeclarar la clase / objeto en los archivos / pestañas de encabezado:

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

Esto no me parece súper limpio, pero todavía no parece tener inconvenientes.

aaaidan
fuente
1
Ah, claro, si quiere asegurarse de que es compatible con Arduino 1.0, debe incluir condicionalmente eso o "Arduino.h" dependiendo de la bandera de compilación de ARDUINO. Consulte mi respuesta para obtener más detalles. Además, el enlace del tutorial en mi respuesta dice que siempre incluya WProgram.h en sus clases
vicatcu