Problema al enviar al puerto serial (se acumula el dato)

Buen día: estoy tratando de enviar estos datos al puerto serie y hasta ahí todo muy bien, el problema es que lo envió cada 100 ms y en vez de sobrescribirse se van acumulando.

ejemplo: estoy enviando #RPM#0#VE#1234#0366F# pero en vez de mostrar eso siempre, empieza #RPM#0#VE#1234#0366F# #RPM#0#VE#1234#0366F# #RPM#0#VE#1234#0366F# y así sucesivamente.

Le agradezco mucho a quien me pueda colaborar

byte enviar[21];
unsigned long tiempoAnterior = 0;
unsigned long intervalo = 1000;  // Intervalo de 100 ms

void setup() {
    Serial.begin(9600);

    enviar[0] = 0x02;
    enviar[1] = 0x52;
    enviar[2] = 0x50;
    enviar[3] = 0x4D;
    enviar[4] = 0x17;
    enviar[5] = 0x30;
    enviar[6] = 0x17;
    enviar[7] = 0x56;
    enviar[8] = 0x45;
    enviar[9] = 0x17;
   
    enviar[10] = 0x31; 
    enviar[11] = 0x32;
    enviar[12] = 0x33;
    enviar[13] = 0x34;

    enviar[14] = 0x17;
    enviar[15] = 0x30;

    enviar[16] = 0x33; 
    enviar[17] = 0x36;

    enviar[18] = 0x36;
    enviar[19] = 0x46;
    enviar[20] = 0x03;
    
    tiempoAnterior = millis();  // Inicializa el tiempo anterior al tiempo actual
}

void loop() {

    unsigned long tiempoActual = millis();  // Obtiene el tiempo actual
        
    if (tiempoActual - tiempoAnterior >= intervalo) {
        Serial.write(enviar, sizeof(enviar));  // Envía los datos a través del puerto serial
        tiempoAnterior = tiempoActual;  // Actualiza el tiempo anterior al tiempo actual
       
    }

    
}

En algún lado de esta línea te falta o sobra un cero.

Añade un cambio de línea:

void loop() {
  unsigned long tiempoActual = millis();  // Obtiene el tiempo actual
  if (tiempoActual - tiempoAnterior >= intervalo) {
    Serial.write(enviar, sizeof(enviar));  // Envía los datos a través del puerto serial
    Serial.println();
    tiempoAnterior = tiempoActual;  // Actualiza el tiempo anterior al tiempo actual
  }
}

Con el cambio de línea, obtendrá filas individuales, por lo que parece ser la solución a su problema (aunque no saber qué/quién tendrá que leer esos datos no es necesariamente la solución).
Mientras tanto, recomiendo usar esta sintaxis para la inicialización de array enviar[], es más compacta y fácil de manejar:

byte enviar[21] = {
    0x02, 0x52, 0x50, 0x4D, 0x17, 0x30, 0x17, 0x56, 0x45, 0x17,
    0x31, 0x32, 0x33, 0x34, 0x17, 0x30, 0x33, 0x36, 0x36, 0x46,
    0x03};

Muchas gracias, tiene razón hay un cero de mas, es que lo puse para poder verlo un poco mas lento y se me olvido quitarlo para poner el código acá.

añadí el salto de linea Serial.println(); pero ahora me queda asi:

#RPM#0#VE#1234#0366F#
#RPM#0#VE#1234#0366F#
#RPM#0#VE#1234#0366F#

lo que necesito hacer es que solo quede #RPM#0#VE#1234#0366F# cada que lo envié porque la idea es ir cambiando los valores en donde esta 1234 pero la trama debe ser siempre esa

Muchas gracias por su respuesta. Lo que hago es enviarle esa trama a un programa en el computador en los cuales cambio el 1234 por valores que simulan rpm.

El problema es que simpre deberia estar solo esta trama #RPM#0#VE#1234#0366F#
pero si hago lo del salto de linea me sale algo asi:

#RPM#0#VE#1234#0366F#
#RPM#0#VE#1234#0366F#
#RPM#0#VE#1234#0366F#

Entonces lo que necesito es que por mas que envié siempre me quede una sola linea y busco y busco pero no logro dar solución

La transmisión en serie es una transmisión en serie básica, es decir, una secuencia de bytes, no existe el concepto de "sobrescribir el texto anterior". Lo que ve desde el Serial Monitor de IDE es simplemente lo que se envía a través de serie. Por lo tanto, corresponde a quien recibe esta información (¿cuál es?) entender que la nueva línea reemplaza los valores anteriores.
Si describe mejor qué es lo que debería recibir esos datos, tal vez podamos brindarle más información.
En cualquier caso, si simplemente quieres tener la última línea en pantalla, debes usar un emulador de terminal (por ejemplo, putty o MobaXterm) y no solo enviar los datos, sino usar los códigos de control para decirle al emulador de terminal que vuelva a empezar. de línea y luego escribir sobre los datos anteriores. Pero, repito, esto es solo una cuestión de visualización, no tiene nada que ver con la calidad de los datos enviados ni con cómo los ves en el Serial Monitor.

Sería muy sencillo lograr ese efecto usando un display LCD; tal vez sea lo que quiere ver @kaine_c7

Gracias por su respuesta: lo que me pasa es que cuando envió la trama al pc me la toma como esta en la foto, como si mandara varias veces de esta forma

#RPM#0#VE#1234#0366F#
#RPM#0#VE#1234#0366F#
#RPM#0#VE#1234#0366F#

Pero cuando conecto el equipo que viene de fabrica, aparece una sola linea

#RPM#0#VE#1234#0366F#

Y sí, es lo que hace tu código, enviar repetidamente la misma secuencia de datos.

Tal vez "el equipo que viene de fábrica" envía una sola linea.

Si no nos dices qué es "el equipo que viene de fábrica" y cual es el programa que usas en el PC ¿cómo pretendes que te ayudemos?

Sino va a aportar nada por lomenos deje de ser grocero, que si pregunto es porque no se y no necesito que venga un gamin a responder feo

¿Quién fue grosero?
Y sí estoy aportando.
Dije lo que veo del código y que sin más datos nadie te va a poder ayudar.

Y te agrego más para que veas que sí estoy aportando.
En la captura de pantalla se ve que la consola está imprimiendo # para los caracteres 0x02 y 0x03, cuando el caracter # tiene código ASCII 0x17. Sin embargo fíjate que el 5to. caracter de la trama sí tiene código 0x17 (o sea, se corresponde con lo que imprime).
Por lo tanto, la consola hace algún tipo de tratamiento de los datos antes de imprimirlos y probablemente falte algo en la trama que envías.

Ahora te pregunto, ¿en lugar de escribir una respuesta para decir que soy grosero sin ninguna razón, no era más fácil usarla para poner los datos que te pedí?

Saludos

Moderador:
For favor @kaine_c7 lee de nuevo las normas del foro respecto del lenguaje que debes usar en el foro.
Si nosotros no entendemos, imagina que queda para los demás.
A mi entender @MaximoEsfuerzo solo te repregunta porque son cosas obvias para nuestra manera de ver las cosas, pero no asumas grocería donde no la hay.
Tema concluido.
Cualquier descargo me lo haces por privado.

Como te preguntaron, debes especificar de qué dispositivo estás hablando y cuál es el formato de este protocolo.
Por ejemplo, si se espera que se envíe EXACTAMENTE un bloque de 21 bytes, eso es una cosa, si, como sospecho en este punto, requiere un terminador de bloque como '\n' y/o la secuencia '\r' ' \n 'entonces su problema es que, dado que falta este terminador, el receptor no "sabe" que los datos están terminados y, por lo tanto, continúa acumulando los bytes recibidos.

Entonces @MaximoEsfuerzo tiene razón (y no, no fue grosero pero te instó a que nos dieras la información necesaria para que podamos entenderte y darte una solución), debes responder estas dos preguntas, con el mayor detalle posible:

  1. ¿De qué dispositivo estamos hablando exactamente?
  2. ¿Cuáles son las especificaciones de su protocolo de comunicación?

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