¿Por qué un comando de salto de línea \n crea un comando adicional de retorno de carro \r?
Estoy tratando de cargar un código en mi MCU Nordic Semiconductor nRF52832 de 32 bits que está integrado en un módulo UWB DWM1001. El módulo envía datos de posición formateados (protocolo MAVLink v1 con un tamaño de mensaje de 101 bytes) como caracteres sin signo a su puerto serie utilizando printf(). El problema es que siempre se agrega un retorno de carro (\r) delante de cada comando de nueva línea (\n) que se envía al puerto. Ahora bien, a veces uno de los bytes en el mensaje puede tener el mismo valor que el comando \n, que es 0x0A en hexadecimal o 10 en decimal. En este caso, automáticamente se envía un byte adicional \r al puerto, lo cual arruina mi protocolo. ¿Cómo puedo deshacerme de esto?
Como ejemplo, adjunto una imagen que muestra la salida del puerto serie del módulo. Es simplemente un contador de tipo uint8_t que cuenta de 0 a 254 y luego se reinicia (ver código a continuación). La función on_dwm_evt se llama regularmente desde un bucle en la función principal. Cuando el contador alcanza el valor 10 (decimal para \n), se agrega un \r (= 13 en decimal, 0x0D en hexadecimal) delante y yo no quiero eso. Agradezco cualquier ayuda.
Debo mencionar que el código personalizado está “incrustado” en el entorno de firmware (llamado PANS) proporcionado por el fabricante Decawave.
Estoy utilizando el entorno de desarrollo integrado SEGGER Embedded Studio en Windows 10 y la cadena de herramientas integrada GNU Arm versión 10.3-2021.10 para compilar mi código.
uint8_t sq = 0;
unsigned char count;
void on_dwm_evt(dwm_evt_t *p_evt) {
/* convertir byte. (Mi mensaje real consiste en múltiples matrices de caracteres) */
count = sq & 0xFF;
/* imprimir contador en el puerto serie */
printf("%c", count);
/* Aumentar contador sq +1 */
if (sq < 254) {
sq = sq + 1;
} else {
sq = 0;
}
}
davy.ai
Solución para eliminar el retorno de carro delante del comando de nueva línea
Para eliminar el retorno de carro (
\r
) delante del comando de nueva línea (\n
) que se envía al puerto serie, puedes utilizar la siguiente solución alternativa:printf()
para enviar los datos de posición, utilizaputchar()
para enviar cada byte de los datos por separado.Verifica cada byte de los datos en busca del valor de
\n
(0x0A en hexadecimal o 10 en decimal).Si el byte es
\n
, envíalo utilizandoputchar()
sin enviar el retorno de carro\r
antes. De lo contrario, envía el byte utilizandoputchar()
como de costumbre.Aquí tienes un ejemplo de fragmento de código:
Esto debería permitirte enviar los datos de posición sin el retorno de carro no deseado delante de
\n
.