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?