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.

Gestión del búfer UART Thingy91

Tengo un dispositivo Nordic Thingy91 y lo estoy integrando con un sensor que funciona a una velocidad de baudios de 1200. Básicamente, envía cadenas que necesito almacenar en un búfer y analizar para su uso. Sin embargo, me enfrento a un problema peculiar en el que obtengo la cadena correcta la primera vez que recibo datos, pero después de eso, recibo valores basura.

A continuación se muestra la parte del código:

uint8_t message_buf[100];
void uart_cb(struct device *x) {
  uart_irq_update(x);

  if (uart_irq_rx_ready(x)) {
    uart_fifo_read(x, message_buf, sizeof(message_buf));
    printk("%s", message_buf);
  }
}

void main(){

struct device *uart = device_get_binding(UART_PORT);
......
uart_irq_callback_set(uart, uart_cb);
......
}

Pensamos que podría ser un problema al administrar el message_buf mientras se obtiene la nueva cadena y queríamos conocer el procedimiento correcto de manejo del búfer. Además, ¿cuál podría ser la causa raíz de que obtenga datos correctos en la primera llamada y obtenga valores basura más tarde?

Saludos cordiales,
Adeel.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    Gestión de búfer

    El problema que está experimentando podría estar relacionado con la gestión del búfer de mensajes. Es importante tener en cuenta que se debe limpiar el búfer cada vez después de que se procese para evitar que se transfieran datos residuales a la próxima iteración.

    Para manejar esto, puede agregar la siguiente línea después de la declaración printk en la función uart_cb:

    memset(message_buf, 0, sizeof(message_buf));
    

    Esto limpiará el búfer después de procesar cada mensaje.

    Causa raíz

    En cuanto a la causa raíz de recibir valores de basura después de la primera llamada, podría estar relacionado con el hecho de que la función uart_fifo_read está leyendo hasta sizeof(message_buf) bytes cada vez. Esto podría llevar a que la función lea más o menos bytes de lo esperado del búfer UART.

    Una solución para esto sería revisar la cantidad de bytes leídos del búfer UART y procesar solamente esa cantidad. Por ejemplo:

    if (uart_irq_rx_ready(x)) {
      uint8_t bytes_read = uart_fifo_read(x, message_buf, sizeof(message_buf));
    
      // Solo procesar la cantidad de bytes leídos
      for (uint8_t i = 0; i < bytes_read; i++) {
        if (message_buf[i] == '\n') {
          // Realizar el procesamiento necesario
        }
      }
    
      // Limpiar el búfer
      memset(message_buf, 0, sizeof(message_buf));
    }
    

    Además, asegúrese de que la velocidad de baudios del dispositivo UART esté configurada correctamente para que coincida con la del sensor.

    ¡Espero que esto ayude! Háganos saber si tiene alguna otra pregunta.

Comments are closed.