Como limpiar el buffer al cargar datos desde el serial?

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 #

No respondas sin editar lo que te he pedido.

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:

Type C o P, ending with #

Linea de texto leida: "C"

Type C o P, ending with #

Linea de texto leida: "

C"

Type C o P, ending with Programming

Pruébalo aca

Agrandé mas el buffer de 10 a 30 y le quité el '\n' que siempre viene al presionar ENTER
Qué arduino estas usando?

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.

La placa que estoy usando es Arduino Uno R3.

Lo probé en wokwi con el nano y funcionó bien, lo probé con el arduino uno y me funciona mal, o sea no estarìa eliminando el intro

Pero lo tenes en el monitor serie?
Por defecto esta sin Ajuste de Linea o Line Feed y si lo tenés asi, claro que no va a descartar nada.

¿Ves algun error aquí?

Ya se lo corrigió y explicó @Surbyte :wink:

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


pero hay otros como
Realterm

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.