Chame Serial.print em um arquivo de guia / cabeçalho separado

9

Estou escrevendo um programa no Arduino 0022.

A chamada Serial.printlnfunciona bem no meu código de esboço principal, mas quando tento usá-lo no meu arquivo de cabeçalho " Menu.h", que está em uma guia separada, recebo um erro:

No arquivo incluído no AppController.cpp: 2:
Menu.h: No construtor 'Menu :: Menu ()':
Menu.h: 15: erro: 'Serial' não foi declarado neste escopo

Como posso usar Serial.printlnfora do código de esboço?

aaaidan
fonte

Respostas:

3

Você não deve chamar funções de dentro dos arquivos de cabeçalho. Os arquivos de cabeçalho são para definir macros do pré-processador (#define) e referências a variáveis ​​/ funções em outros arquivos.

Você deve criar vários arquivos C e vinculá-los juntos em tempo de compilação. O arquivo de cabeçalho é usado para informar a cada arquivo C quais funções e variáveis ​​os outros arquivos C possuem.

Para usar vários arquivos no Arduino IDE, você precisa de pelo menos 1 arquivo de cabeçalho para descrever as funções que estão nos outros arquivos que você deseja compartilhar entre eles. Além disso, quaisquer variáveis ​​globais que você deseja usar em todos os arquivos.

Essas definições devem ser qualificadas com o atributo "externo".

Então você precisa adicionar um ou mais arquivos "pde" que contenham o código real e as definições de variáveis ​​para as funções.

Por exemplo, eu tenho um arquivo "mouse.h":

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

e um arquivo "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);
}

Então, no meu arquivo principal, tenho:

#include "mouse.h"

e posso chamar as funções que estão no "mouse.pde" como se estivessem no arquivo local.

Majenko
fonte
Obrigado Majenko, sua resposta é muito útil para mim como um codificador C ++ iniciante, e definitivamente adotarei seu conselho. Mesmo assim, eu estava mais interessado em saber por que a classe Serial não está disponível fora do esboço principal. Felicidades!
aaaidan
3

Como alternativa à resposta muito boa do @ Majenko, você pode criar uma classe C ++ para encapsular suas funções e colocá-la na pasta de bibliotecas, conforme descrito em http://www.arduino.cc/en/Hacking/LibraryTutorial .

Talvez você precise #include <Serial.h>no arquivo de implementação da sua classe para poder chamar métodos Seriais. Eu tomaria cuidado ao fazer isso, pois obviamente existem efeitos colaterais ao chamar funções seriais (leia em particular). Prefiro definir um método na minha classe que use um caractere * e passe bytes da interface serial para ele no meu programa principal, em vez de interagir diretamente com a interface serial.


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif
vicatcu
fonte
Oi! Sim, dei uma olhada no diretório da biblioteca do arduino para Serial.h ou similar, e tudo o que pude encontrar foi o HardwareSerial.h, que não continha as definições necessárias. No final, me deparei com a solução de incluir <WProgram.h>, que parece declarar o objeto Serial.
aaaidan
0

Encontrei uma maneira de Serialdeclarar a classe / objeto nos arquivos / guias do cabeçalho:

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

Isso não parece super limpo para mim, mas ainda não parece ter nenhuma desvantagem.

aaaidan
fonte
11
Ah, certo, se você quiser ter certeza de que é compatível com o Arduino 1.0, inclua condicionalmente isso ou "Arduino.h", dependendo do sinalizador de compilação do ARDUINO, veja minha resposta para um detalhe. Além disso, o link tutorial na minha resposta diz sempre incluir WProgram.h em suas classes
vicatcu