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:
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:
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.
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
¿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í?
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:
¿De qué dispositivo estamos hablando exactamente?
¿Cuáles son las especificaciones de su protocolo de comunicación?