Leer una cadena y escribirla por el puerto serial modificada

Saludos, tengo un problema con un codigo pequeño, lo que necesito hacer es recibir una cadena por el puerto serial del arduino, al recibirlo necesito modificar la extructura de este y cuando este modificado enviarlo por el puerto serial (tx).

esta es la cadena que recibo(ejemplo) ( 33140KG ) va con sus espacios,
esta es la cadena que debo enviar (ejemplo (+03314015) va con sus espacios

este es el codigo que tengo hasta el momento

#include <SoftwareSerial.h>
String cadena;
String peso;
String dato;

void setup() { 
  Serial.begin(9600);   //Salida 
 }
void loop() {
  
  if (Serial.available() > 0) {
    char dato = Serial.read();
    if (dato != '\r') {
      cadena.concat(dato);}{
      peso = cadena.substring(3,8); 
    
     
    Serial.write(02);
    Serial.write("+");
    Serial.print ("0");
    Serial.print(peso);
    Serial.print("015");
    Serial.write(03);
    Serial.println("");}
        
  }
  }

Buenas:

Para dejarlo más claro.

¿Puedes escribir paso por paso qué es lo que quieres hacer exactamente?

Me cuesta entenderte o estoy con sueño. :wink:

Por lo que te entiendo.

  1. Recibes una cadena por el puerto serie. Vale, dime que cadena recibe exactamente, lo escribes tal cual, espacios incluidos.

  2. Modificas la estructura de esa cadena.

  3. Cuando esté ya modificado, que esto ya se guarda en una variable a parte, lo envias por el puerto serie.

¿Es así?

Cuidado cuando usas serial.print y serial.write, tienes que tener claro lo que hacen.

Saludos.

Lo que estoy haciendo es agarrar una cadena que me entrega un Indicador de peso, y lo mando aun display, pero el problema es que el display no reconoce el formato de la cadena del indicador, por lo tanto tengo que pasarla por el arduino para intervenirla y luego mandarla por el puerto TX hacia el dysplay.

desde el indicador recibo esta cadena ( 33140KG ) cuando digo que viene con esos espacios, es por q tengo dos datos en asci que son inicio y termino de mensaje. Por lo tanto cuando agarro el dato con la funcion cadena.substring(4,9) solamente guardo los valores q me interesan que son el peso.

Luego con los serial.print imprimo en el serial por parte la extructura de la cadena que quiero obtener. Eso hasta el momento funciona bien. el tema es cuando el peso varia, la cadena.substring queda con el primer peso que guardo y no varia. y si utilizo
cadena=""; se borra y no aparece que guarde el peso.

ademas que al recibir un peso, la idea es que me imprima una vez solamente la cadena que deseo obtener y el resultado es este:

17:17:08.975 -> +0015
17:17:08.975 -> +0015
17:17:08.975 -> +0015
17:17:08.975 -> +0 015
17:17:09.009 -> +0 3015
17:17:09.009 -> +0 33015
17:17:09.009 -> +0 331015
17:17:09.043 -> +0 3314015
17:17:09.043 -> +0 3314015
17:17:09.077 -> +0 3314015
17:17:09.077 -> +0 3314015
17:17:09.112 -> +0 3314015
17:17:09.112 -> +0 3314015

en resultante deberia obtener solo (+0 3314015) eso

y que cada vez que recibo un valor distinto por el RX del serial, esta funcion se me actualize Serial.print(peso);

Espero haberlo aclarado un poco, gracias

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>



Esta simple modificación debería entregar la respuesta que buscas.

Atencion: No respondas hasta editar

void loop() {
	if (Serial.available() > 0) {
		char dato = Serial.read();
		if (dato != '\r') {
			cadena.concat(dato);}{
			peso = cadena.substring(3,8);
		}
		else {
			Serial.write(02);
			Serial.write("+");
			Serial.print ("0");
			Serial.print(peso);
			Serial.print("015");
			Serial.write(03);
			Serial.println("");}
		}
	}
}

Tu código imprimía con cada caracter recibido por eso lees esa respuesta.
Si, solo esperas al último caracter, el String peso se carga con el valor y luego presentas todo.

Gracias amigo,con este codigo ya puedo enviar los datos y replicarlos en el display enviando los datos por el puerto TX.
Ahor el problema que tengo que recibo muchos datos y envio menos de los que recibo.
Estoy intentando enviar un dato por dato recibido pero no logro hacer que funcione, si alguien tiene una idea de como hacerlo o una pista, seria de gran ayuda

void loop() {
  if (Serial.available() > 0) {
    char dato = Serial.read();
    if (dato != '\r') {
      cadena.concat(dato);}{
      peso = cadena.substring(3,8);
    }}
    else {
      Serial.write(02);
      Serial.write("+");
      Serial.print ("0");
      Serial.print(peso);
      Serial.print("015");
      Serial.write(03);
      Serial.println("");
      cadena = "";}
    }

Saludos, Tengo un problema que se ve simple pero no lo eh podido solucionar.

lo que pasa es que necesito enviar un dato por el puerto tx de mi arduino nano despues de recibir uno por el puerto rx, El problema es que cuando recibo por el puerto RX comienzo a mandar datos sin parar y eso me genera un problema.

como solucion necesito que al recibir un dato por RX enviar solamente un dato por el puerto TX.
El codigo es el siguiente

En Resumen mi codigo lo que hace es recibir un string de peso, el que guardo, luego rescato los datos necesarios y los imprimo en un nuevo string, al imprimirlo borro el dato que habia recibido, para recibir uno nuevo.

void loop() {
  if (Serial.available() > 0) {
    char dato = Serial.read();
    if (dato != '\r') {
      cadena.concat(dato);}{
      peso = cadena.substring(3,8);
    }}
    else {
      Serial.write(02);
      Serial.write("+");
      Serial.print ("0");
      Serial.print(peso);
      Serial.print("015");
      Serial.write(03);
      Serial.println("");
      cadena = "";}
    }

que tal así

void loop() {
  if (Serial.available() > 0) {
    char dato = Serial.read();
    if (dato != '\r') {
      cadena.concat(dato);}{
      peso = cadena.substring(3,8);
	  // se terminó de recibir los datos
	  delay(100);  // no me gustan los delays pero le doy un tiempo.
	  Serial.write(02);
      Serial.write("+");
      Serial.print ("0");
      Serial.print(peso);
      Serial.print("015");
      Serial.write(03);
      Serial.println("");
    }
  }
  else {
      cadena = "";
  }
}

De esa forma estaria casi, Solo que vuelvo a tener un problema que tenia antes y es que recibo varios datos antes del que necesito.
por ejemplo, solo necesito 14:17:11.761 -> +011390015 los anteriores son basura.
14:17:10.635 -> +0015
14:17:10.736 -> +0015
14:17:10.839 -> +0015
14:17:10.941 -> +01015
14:17:11.045 -> +011015
14:17:11.149 -> +0113015
14:17:11.251 -> +01139015
14:17:11.352 -> +011390015
14:17:11.454 -> +011390015
14:17:11.556 -> +011390015
14:17:11.660 -> +011390015
14:17:11.761 -> +011390015
14:17:14.596 -> +0015
14:17:14.697 -> +0015
14:17:14.800 -> +0015
14:17:14.903 -> +01015
14:17:15.006 -> +011015
14:17:15.110 -> +0113015
14:17:15.215 -> +01139015
14:17:15.284 -> +011390015
14:17:15.385 -> +011390015
14:17:15.487 -> +011390015
14:17:15.590 -> +011390015
14:17:15.692 -> +011390015
14:17:29.087 -> +0015
14:17:29.190 -> +0015
14:17:29.291 -> +0015
14:17:29.394 -> +02015
14:17:29.496 -> +022015
14:17:29.599 -> +0223015
14:17:29.700 -> +02239015
14:17:29.803 -> +022390015
14:17:29.904 -> +022390015
14:17:30.008 -> +022390015
14:17:30.111 -> +022390015
14:17:30.212 -> +022390015

¿No tenías un tema abierto sobre la misma consulta y @Surbyte ya te había explicado como solucionarlo?

Saludos

Ahora miraré lo que @anon90500195 me dice, espero que no sea el caso.

void loop() {
  if (Serial.available() > 0) {
    char dato = Serial.read();
    if (dato != '\r') {
		cadena.concat(dato);}{
	}
	else {
		peso = cadena.substring(3,8);
		// se terminó de recibir los datos
		delay(100);  // no me gustan los delays pero le doy un tiempo.
		Serial.write(02);
		Serial.write("+");
		Serial.print ("0");
		Serial.print(peso);
		Serial.print("015");
		Serial.write(03);
		Serial.println("");
	}  
  }
  else
      cadena = "";
}

Moderador:
Por favor, lee las Normas del foro y evita en el futuro el doble posteo.
Te envío privado.

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