tamaño de búfer circular FIFO en más de UART

3

Estoy intentando implementar un protocolo UART para establecer la comunicación entre dos placas. los datos están codificados en ASCII y la longitud de los mensajes son variables. He elegido implementar un paquete para "encapsular" información.

Paquete: {STX, DATA, ETX}.

STX es "Inicio de texto" en la tabla ASCII. Su código Hex es 0x02 , ETX es "Fin de texto". Su código hexadecimal 0x03 . Cada byte en el campo DATOS puede tomar cualquier valor desde 0x00 a 0x7F excepto 0x02 y 0x03 .

Problema 1: longitud de datos
¿Cómo enviar longitudes de datos variables sobre uart?
Ejemplo: {STX, Hello \ 0, RTX} y {STX, este es un texto largo \ 0, RTX}

He estado cavando en Internet y encontré que el mejor enfoque es utilizar un búfer circular FIFO. ¿El problema es cómo arreglar BUFFER_SIZE en este caso? Digamos que hice algunos cálculos y me di cuenta de que el mensaje más largo que transmitiré a través de UART es de 90 bytes y el más corto es de 4 bytes. ¿Debo #define BUFFER_SIZE 90 o necesito tomar un búfer más grande?

En ambos casos, ¿cómo funciona FIFO en estos casos:
Caso 1: DATOS de longitud < BUFFER_SIZE.
Ejemplo: {STX, ABCD, ETX} y BUFFER_SIZE = 90 bytes.

Caso 2: el búfer está lleno pero los datos siguen llegando.
Ejemplo: BUFFER_SIZE = 13

Paquete: {STX, READ_X, ETX} {STX, REMOVE_Y, ETX}.

En HEX, estos mensajes son
0x02 0x52 0x45 0x41 0x5 0x5f 0x58 0x00 0x03 0X02 0x52 0x45 0x4d 0x4f 0x56 0x45 0x5f 0x59 0x00 0x03

El búfer está lleno cuando alcanzamos 0x4d (en cursiva). ¿Cómo lidiar con esta situación?

    
pregunta Pryda

2 respuestas

2

Obviamente, necesita tener algún proceso que saque los datos de la FIFO siempre que descubra que no está vacío. El FIFO debe ser lo suficientemente profundo como para ocuparse de la discrepancia en el peor de los casos entre la tasa de colocación y la tasa de retirada.

En términos generales, los UART normalmente son lo suficientemente lentos para que las otras actividades de la CPU puedan mantenerse, lo que significa que el FIFO puede ser relativamente superficial, pero si su aplicación es lo suficientemente compleja, es posible que necesite un búfer más grande.

Por ejemplo, si sabe que el proceso de consumo se puede bloquear durante un período de tiempo, el FIFO debe ser lo suficientemente profundo como para contener al menos la cantidad de caracteres que pueden llegar en ese período de tiempo.

    
respondido por el Dave Tweed
2

Primero en entrar, primero en salir Independientemente de la información que ingrese, se almacenará en FIFO de forma secuencial a partir de una ubicación de memoria. Supongamos que el ancho de los datos FIFO es de un byte y el tamaño total de la memoria es de 90 bytes, esto significa que tiene 90 ubicaciones de memoria y almacenará cada byte entrante de forma secuencial en las ubicaciones de la memoria. Lees bytes fuera de él en la forma de "Primera lectura escrita primero". Cuando lees un byte, esa ubicación ahora es "libre" para ser sobrescrita. Se dice que FIFO está completo, cuando ha escrito bytes a su capacidad total pero aún no ha leído ningún byte. Supongamos que el FIFO está lleno y los datos siguen llegando, lo que sucede es que los nuevos bytes sobrescribirán los datos más antiguos (desde la primera ubicación) de forma secuencial. Así ocurre la pérdida de datos. Así que tienes que leer el búfer antes de que se llene. Supongamos que 90 bytes están llegando a UART Receiver FIFO a cierta velocidad en baudios. Se llenará en un tiempo definido dependiendo de la velocidad en baudios, antes de recibir el mensaje completo. Si usa FIFO con tamaño < Luego, 90 bytes, debe asegurarse de leer los bytes antes de que se llenen. Si el tamaño de FIFO es mayor que 90 bytes y no entran más bytes, los datos permanecerán en FIFO, y puede leer esos bytes en cualquier momento.

    
respondido por el MITU RAJ

Lea otras preguntas en las etiquetas