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.