Preciso ler dados da serial e compara-los com um padrão (protocolo).
Não tenho muita experiência, então não sei se é melhor criar uma string de entrada e depois fazer a comparação ou fazer uma rotina para tratar cada byte recebido sem montar uma string.
Para começar fiz o seguinte código tentando jogar os bytes lidos da serial numa string:
const int N = 10;
char inMsg[N];
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available() > 0)
{
int i = 0;
while((Serial.available() > 0) && (i < N))
{
inMsg[i] = Serial.read();
++i;
}
// teste: imprime array para verificar o conteudo
imprimeMsg();
}
}
void imprimeMsg()
{
int i = 0;
//for(i = 0; i < (sizeof(inMsg) / sizeof(char)); i++)
for(i = 0; i < N; i++)
{
Serial.print("inMsg[");
Serial.print(i);
Serial.print("] = ");
Serial.println(inMsg[i]);
}
}
O problema é que no teste, enviando a string '0123456789', tem ocorrido o seguinte:
Obrigado por responder.
Seu código deu certo. Mas a função imprimeMsg() deve percorrer o array de caracteres (string) para verificar se cada índice possui conteúdo válido.
Por exemplo, se eu mandar 123 pela serial, inMsg deve ficar assim:
inMsg[0] = 1
inMsg[1] = 2
inMsg[2] = 3
inMsg[3] =
inMsg[4] =
...
Desta forma eu poderei comparar se corresponde com o protocolo que irei utilizar.
Eu suspeito que tem a ver com o facto de todo o código do Arduino correr dentro duma funcão (setup ou loop) e não directamente na main. Nada como experimentar esse código em cima e ver as diferencas. Outra coisa que convém teres em atencão tem a ver com o facto que o compilador para AVR pode ou não obedecer às convencões do C para computadores e não sabes exactamente as opcões de optimizacão que activaram no compilador. Tudo isso são possibilidades para explicar isto.
Isto é uma maneira de passar esse problema. Também podes usar um string terminator e percorrer a string até o encontrar. Normalmente usa-se '\0'.
Note that sizeof returns the total number of bytes. So for larger variable types such as ints, the for loop would look something like this. Note also that a properly formatted string ends with the NULL symbol, which has ASCII value 0.
Logo parece-me que o sizeof vai procurar por um \0 para retornar um valor.