Usando un buffer circular sobre UART

1

Estoy configurando un protocolo UART que permite la comunicación entre 2 placas; Una placa maestra y una tabla de esclavos. La comunicación entre ellos será así:
Ejemplo 1:
Maestro [Tx] - GET_VALUE - > [Rx] Slave
Maestro [Rx] < - 0x05 -------- [Tx] Esclavo

Ejemplo 2:
Maestro [Tx] - GET_STATUS ----------- > [Rx] Slave
Maestro [Rx] < - I_AM_BUSY ------------ [Tx] Slave

Ejemplo 3:
Maestro [Tx] - START_OPERATION - > [Rx] Slave
Maestro [Rx] < ---------- ACK ------------ [Tx] Slave

El tamaño de los datos es de 1 byte para la mayoría del flujo de datos entre las dos tarjetas. Es por eso que voy a usar macros para definir estos comandos:

Ejemplo:

  #define GET_VALUE 0x05
  #define START_OPERATION 0x06
  etc ...

Además de estos datos de 1 byte, solo hay un elemento que debe transmitirse entre las dos placas y su tamaño no es 1 byte. De hecho, estoy dispuesto a usar la serialización para transmitir una estructura de datos a través de UART utilizando un búfer FIFO circular

Ejemplo:
Maestro [Tx] - GET_STRUCTURE ------------ > [Rx] Slave
Maestro [Rx] < ---------- ESTRUCTURA ------------ [Tx] Esclavo

typedef struct{
uint8_t var1;
uint8_t var2;
uint8_t var3;
}MyStructTypeDef;

Se transmitirá por UART en este formato "nombre_variable: valorXXX":

  

var1: 123XXXvar2: 456XXXvar3: 789XXX

XXX es un separador

Mi pregunta es: si el 99% del flujo de datos tiene un tamaño de 1 byte y solo el 1% del flujo de datos no tiene un tamaño de 1 byte, ¿debo usar el búfer circular solo para obtener la estructura? ¿Hay una mejor manera de estandarizar la longitud de los datos pasados sobre uart?

    
pregunta Pryda

2 respuestas

2

¿Puede el maestro ocupado-esperar en la UART esperando respuestas? ¿Puede recopilar y procesar los caracteres recibidos lo suficientemente rápido para evitar sobrecargas? Si no, entonces necesitas un búfer.

Si el mensaje más largo cabrá en el búfer y lo restableces al enviar cada comando, no es necesario que sea circular.

  

Estoy dispuesto a usar la serialización para transmitir una estructura de datos ... en este formato "nombre_variable: valorXXX" ...

     

¿Existe una mejor manera de estandarizar la longitud de los datos que se pasan?   uart?

Supongo que el 'XXX' coloca la cadena en una longitud fija. Podría ser más eficiente crear una cadena de longitud variable con separadores de un solo carácter, o incluso enviar los números en binario sin formato, pero si el ancho de banda no es un problema, entonces lo que está haciendo está bien.

Es posible que también quieras pensar qué hacer si el maestro y el esclavo se desincronizan. Por ejemplo, si el esclavo está enviando una estructura pero el maestro está esperando una respuesta a un comando diferente, algunos de los caracteres en el mensaje de la estructura pueden ser malinterpretados como respuestas válidas. También esto,

Master [Tx] -- GET_VALUE--> [Rx] Slave
Master [Rx] <-- 0x05 -------- [Tx] Slave 

es preocupante. ¿Puede el 'valor' ser cualquier número binario? Si es así, ¿cómo sabrá que no es una respuesta a otro comando? Las respuestas críticas como I_AM_BUSY y ACK deben tener valores únicos que no pueden aparecer en otros datos.

    
respondido por el Bruce Abbott
0

usted podría tener el ISR que atiende la escritura interruota de recepción en serie directamente en las variables, tendría que rastrear su propio estado para que sepa dónde escribir.

es posible que necesite un problema de exclusión mutua si la actualización podría ser un problema.

para enviarlo necesitaría saber qué cosas deben enviarse

    
respondido por el Jasen

Lea otras preguntas en las etiquetas