Como percorrer dados obtidos da serial?

Experimenta isto

char str_1[] = "hello";
char str_2[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
char str_3[10];

void setup() {

char str_1_local[] = "hello";
char str_2_local[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
char str_3_local[10];

Serial.println("These are the external arrays:");
Serial.print("str_1");
Serial.println(sizeof(str_1));
Serial.print("str_2");
Serial.println(sizeof(str_2));
Serial.print("str_3");
Serial.println(sizeof(str_3));

Serial.println("These are the local arrays:");
Serial.print("str_1");
Serial.println(sizeof(str_1_local));
Serial.print("str_2");
Serial.println(sizeof(str_2_local));
Serial.print("str_3");
Serial.println(sizeof(str_3_local));

}

void loop() {}

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'.

#define ARRAY_SIZE   10
char array[ARRAY_SIZE];
unsigned char chars_in_array = 0;


array[chars_in_array++] = Serial.read();


for (i = 0; i< chars_in_array; i++) {
  Serial.println(array[i]);
}

Algo assim...

Edit:

No site tinha isto:

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.