es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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;
    }
}

Imagen

Tags:  , , ,

Answer

  1. Avatar for 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:

    • En lugar de usar printf() para enviar los datos de posición, utiliza putchar() 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 utilizando putchar() sin enviar el retorno de carro \r antes. De lo contrario, envía el byte utilizando putchar() como de costumbre.

    Aquí tienes un ejemplo de fragmento de código:

    void on_dwm_evt(dwm_evt_t *p_evt) {
        /* convertir byte. (Mi mensaje real consta de múltiples arreglos de caracteres) */        
        count = sq & 0xFF;
    
        /* Envía cada byte del mensaje por separado */
        for (int i = 0; i < MESSAGE_SIZE; i++) {
            /* Verifica si el byte es "\n" */
            if (message[i] == '\n') {
                /* Envía el byte sin el retorno de carro previo */
                putchar(message[i]);
            } else {
                /* Envía el byte como de costumbre */
                printf("%c", message[i]);
            }
        }
    
        /* Aumenta el contador sq en +1 */
        if (sq < 254) {
            sq = sq + 1;
        } else {
            sq = 0;
        }
    }
    

    Esto debería permitirte enviar los datos de posición sin el retorno de carro no deseado delante de \n.

Comments are closed.