Utilisation d’un tampon circulaire sur UART

Pryda

Utilisation d’un tampon circulaire sur UART


Je mets en place un protocole UART qui permet la communication entre 2 cartes; Une carte maître et une carte esclave. La communication entre eux va être comme ceci:

Exemple 1:


Maître [Tx] – GET_VALUE -> [Rx]


Maître
esclave [Rx] <- 0x05 ——– [Tx] Esclave

Exemple 2:

Maître [Tx] – GET_STATUS ———–> [Rx]


Maître
esclave [Rx] <- I_AM_BUSY ———— [Tx] Esclave

Exemple 3:

Maître [Tx] – START_OPERATION -> [Rx]


Maître
esclave [Rx] <———- ACK ———— [Tx] Esclave

La taille des données est de 1 octet pour la plupart des flux de données entre les deux cartes. C’est pourquoi je vais utiliser des macros pour définir ces commandes:

Exemple:

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

En plus de ces données de 1 octet, il n’y a qu’un seul élément qui doit être transmis entre les deux cartes, sa taille n’est pas de 1 octet. En fait, je suis prêt à utiliser la sérialisation pour transmettre une structure de données sur UART en utilisant un tampon FIFO circulaire

Exemple:

Maître [Tx] – GET_STRUCTURE ————> [Rx]


Maître
esclave [Rx] <———- STRUCTURE ——– —- [Tx] Esclave

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

Doit être transmis via UART dans ce format « nom_variable: valeurXXX »:

var1: 123XXXvar2: 456XXXvar3: 789XXX

XXX est un séparateur

Ma question est la suivante: si 99% du flux de données est de 1 octet et seulement 1% du flux de données n’est pas de 1 octet, dois-je utiliser un tampon circulaire uniquement pour obtenir la structure? Existe-t-il un meilleur moyen de normaliser la longueur des données transmises sur uart?

Chris Stratton

Vous avez ici deux difficultés distinctes. La première consiste à concevoir un protocole à 1 octet qui peut également déplacer des valeurs arbitraires sans confusion. Sauf si vous avez besoin de vitesse, vous pouvez envisager des lettres et des chiffres; ou en utilisant un format numérique à 7 bits, le 8e étant réservé à vos codes d’état spéciaux. En termes de mise en mémoire tampon, il ne s’agit généralement pas de sens, mais plutôt de savoir si vous êtes en mesure de traiter les données à mesure qu’elles arrivent. Si c’est le cas, vous pourriez simplement avoir un tampon « struct en cours de collecte » plutôt qu’un tampon circulaire. Sinon, vous voudrez probablement tout passer par un tampon entre l’ISR et le consommateur.

Jasen

est-ce une étape de verrouillage ou asychrone, avec MASTER envoyer plus d’une commande avant de vérifier les réponses?

Pryda

@Jasen It’s Asynchronous

immibis

Il serait beaucoup plus facile d’envoyer votre structure en 4 octets: un octet indiquant ce qui se passe (appelez-le THIS_IS_MY_STRUCTURE ou autre), puis les 3 octets de structure. Ce sont des variables à un octet, envoyez simplement l’octet au lieu de le convertir en décimal.

Réponses


 Bruce Abbott

Le maître peut-il attendre sur l’UART en attendant des réponses? Peut-il collecter et traiter les caractères reçus assez rapidement pour éviter les dépassements? Sinon, vous avez besoin d’un tampon.

Si le message le plus long tient dans le tampon et que vous le réinitialisez lors de l’envoi de chaque commande, il n’a pas besoin d’être circulaire.

Je suis prêt à utiliser la sérialisation pour transmettre une structure de données … dans ce format « nom_variable: valeurXXX » …

Existe-t-il un meilleur moyen de normaliser la longueur des données transmises sur uart?

Je suppose que le ‘XXX’s pad la chaîne à une longueur fixe. Il pourrait être plus efficace de créer une chaîne de longueur variable avec des séparateurs à caractère unique, ou même d’envoyer les nombres en binaire brut, mais si la bande passante n’est pas un problème, alors ce que vous faites est bien.

Vous pouvez également penser à ce que vous devez faire si le maître et l’esclave se désynchronisent. Par exemple, si l’esclave envoie une structure mais que le maître attend une réponse à une commande différente, certains des caractères du message de structure peuvent être mal interprétés comme des réponses valides. Aussi ça,

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

est troublant. La «valeur» peut-elle être n’importe quel nombre binaire? Si oui, comment saurez-vous que ce n’est pas une réponse à une autre commande? Les réponses critiques telles que I_AM_BUSYet ACKdoivent avoir des valeurs uniques qui ne peuvent pas apparaître dans d’autres données.


 Jasen

vous pourriez avoir l’ISR qui dessert l’écriture d’interruption de réception série directement dans les variables, il aurait besoin de tracer son propre état pour qu’il sache où écrire.

il se peut que vous ayez besoin d’un mutex. Les problèmes de mise à jour peuvent être un problème.

pour l’envoyer, il faudrait savoir quelles choses doivent être envoyées

 

circulaire, d’un, sur, Tampon, UART, utilisation

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *