Necesito cargar datos desde el serial. no entiendo bien el comportamiento. Hice el siguiente schetch para explicar lo que no se como hacer.
La primera vez que cargo datos, me los deja correctamente en el array buffer comenzando desde el indice 0.
La segunda vez que ingreso datos, me deja vacios los indices o posiciones del array buffer 0 y 1 y me carga lo que ingresè desde el indice 2.
De ahi en adelante siempre se comporta como el punto anterior
El tema es que este comportamiento me impide buscar la info que necesito en el buffer, dado que la primera vez està en el indice 0 y las otras veces en el indice 2.
Al dejar correr el timeout, la primera vez vuelve a dejar vacio los indices 0 y 1 y la segunda vez que supero el time out recièn allì es como que vacìa el buffer. Al pròximo ingreso la info se empieza a cargar desde la posiciòn 0, y las proximas cargas vuelve a empezar a cargar desde la posiciòn 2.
El tema es si hay una forma de "blanquear" o "limpiar" el buffer o pasar el buffer a una variable eliminando las posiciones en blanco o algo asì...esto ultimo aùn no lo probè, se me acaba de ocurrir.
Copio el scketch:
byte buffer[2];
byte len2;
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.setTimeout(20000L) ; // wait until 20 seconds for input from serial
//
Serial.println(F("Type C o P, ending with #"));
len2 = Serial.readBytesUntil('#', (char *) buffer, 10) ; // read opcion C o P (carta o posicion)
for (byte i = len2; i < 10; i++) buffer[i] = ' '; // pad with spaces
Serial.println(len2);
for (byte i = 0; i < 10; i++) {
Serial.print (i);Serial.write(buffer[i]);
}
Moderador:
Por favor, lee las Normas del foro y publica/edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado/editado, lo cortas y click en (<CODE/>)
Lo primero que veo es que tu array es de 2 dimensiones y esperas mas datos por lo tanto hay desbordamiento y con ello usando punteros cualquier cosa.
Asi que incrementa el tamaño del buffer a 10 como minimo.
Yo cargué C1234# y obtuve esto
Simulation
00:10.944
100%
Type C o P, ending with #
4 cuantos bytes se introdujeron, Bien!!
0C1122334 5 6 7 8 9 Type C o P, ending with #
11222334 esta mal
Luego se colgó mi simulador wokwi.com asi que a esperar.
Estoy probando con esto:
char buffer[10];
int len2;
void setup() {
Serial.begin(115200);
Serial.setTimeout(20000L) ; // wait until 20 seconds for input from serial
Serial.println(F("Type C o P, ending with #"));
}
void loop() {
if (Serial.available()) {
buffer[Serial.readBytesUntil('#', buffer, sizeof(buffer) - 1)] = 0; // Colocar el terminador de cadenas de caracteres
Serial.read(); // Descarta el '#'
Serial.print(F("Linea de texto leida: \""));
Serial.print(buffer);
Serial.println('\"');
Serial.println(F("Type C o P, ending with #"));
}
}
Esta es la respuesta que obtuve
Simulation
00:18.474
100%
Type C o P, ending with #
Linea de texto leida: "C1234"
Type C o P, ending with #
Me sigue pasando lo mismo, la primera vez anda bien desde el segundo ingreso de datos en adelante no se comporta igual lo que queda almacenado en buffer:
Ese es el punto, me parece que darle el intro al final de la cadena ingresada y luego del #-, ese intro queda en los dos primeros bytes de la pròxima cadena.
Si claro, en varias de las pruebas que fui haciendo me quedò distinta la longitud, de todas maneras si bien está mal y lo corregí; eso no resuelve el problema de la conformación distinta del mensaje en cada iteración.
Bien ahí puse el monitor serie "Sin ajuste de linea" y alli funciona como necesito!
Ese ajuste del monitor serie se puede hacer en el scketch al momento de inicializarlo o hay que hacerlo en forma manual?
Muchas gracias por la ayuda
Hombre, que tiene que ver el arduino con la PC? Son dos dispositivos independientes.
Para que uno le diga al otro que hacer debe haber algo (programa) que este esperando eso.
Porque no usas otro programa para ver la salida serial, hay muchos.
Yo uso Termite