Conception du schéma de réception de données du port série

Cet article est une note d'expérience, enregistrant les stratégies d'analyse des données de réception du port série rencontrées au travail.

       Cet article prend le port série comme exemple, mais il peut également être étendu à d'autres endroits où deux appareils communiquent. Tant qu'il s'agit de transmission et de transfert de données, il y aura communication. Tant que les taux de traitement des communications les appareils sont différents, il y aura un cache. Tant qu'il y aura un cache, il y aura un cache. Cela implique l'organisation des données, et le modèle premier entré, premier sorti correspond à la plupart des situations de communication dans le monde réel , et les files d'attente sont devenues le meilleur choix pour la mise en cache. La taille de la file d'attente dépend du processeur et de l'application. Un choix raisonnable doit garantir qu'il y a suffisamment d'espace pour recevoir chaque paquet de données lorsqu'il arrive, et que le programme peut traiter les données mises en cache et générer suffisamment d'espace avant l'arrivée du prochain paquet de données.

Le port série recevant les données doit essentiellement être une méthode d'interruption, mais le traitement des données est différent.

Le premier mode : traitement d'interruption.Le traitement d'interruption signifie que la fonction de traitement d'analyse est exécutée dans la fonction de rappel d'interruption, qui convient aux petites quantités de données.

Le deuxième mode : traitement des requêtes, il n'y a pas de retard dans le programme, il suffit de demander si des données arrivent, puis d'opérer lorsque les données arrivent. Cette situation est adaptée à la réception d'instructions.

Le premier mode : le mode minuterie. Dans ce mode, le cycle de l'expéditeur qui envoie des données est connu et la longueur de chaque trame de données est déterminée. De cette façon, une minuterie de durée égale est utilisée dans le programme pour recevoir et traiter les informations correspondantes à chaque fois.

Dans la fonction d'analyse, il existe plusieurs situations en fonction de la réception des données : 1. Il n'y a pas de données ; 2. Il y a des données mais seulement un petit peu, ce qui n'est pas suffisant pour une image ; 3. La longueur d'exactement une image ; 4. Plus d'une image. Longueur, moins de 2 images ; 5, trop de données dépassent la zone de cache.

Dans la situation ci-dessus, ne faites rien s'il n'y a pas de données et attendez simplement les données ; trop de données dépassent la zone de cache. Cette situation doit être prise en compte lors de la conception et des tests et peut être évitée, qu'il s'agisse d'étendre la zone de cache ou d'optimiser temps de traitement de la fonction, ou réduire la fréquence de l'expéditeur. Dans le processus d'exécution réel du programme, la plupart d'entre eux appartiennent à la situation 2-3-4. Après avoir traité une image, la situation 4 devient la situation 2, le but principal est donc de gérer la situation 2-3. les données sont Mais que dois-je faire si elles sont toujours inférieures à une image ?

Ma réponse est de continuer à attendre, mais pas à bloquer l'attente. Dans ce cas, l'initiative du destinataire dépend entièrement de l'expéditeur. Dans l'analyse de chaque trame de données, il y a généralement certaines caractéristiques à extraire, telles que l'en-tête de trame, la fin de trame, la longueur, la somme de contrôle et les caractères spéciaux définis par les deux parties. Le protocole de communication est le format de données que tout le monde respecte et l'analyse est effectuée sur la base du protocole. Comment attendre ? Prenons comme exemple les personnages suivants :

$CSDN,6,abcdef,07\r\n

Dans les données affichées ci-dessus, l'en-tête de la trame est $CSDN, les données sont séparées par des virgules, le deuxième segment représente la longueur, le troisième segment représente les données, le quatrième segment représente la somme de contrôle XOR et \r\n représente la fin. des données.

Lorsque le programme vérifie les données reçues pour la première fois, il ne peut recevoir que 1 octet $. Cela peut être le début de données valides ou un code tronqué. Nous le traitons d'abord comme le début de caractères valides et l'enregistrons dans un tableau (ce tableau Indique les données valides que nous allons analyser) , la prochaine fois qu'il sera détecté, il s'agira de C. À ce stade, nous continuons à considérer ce caractère comme des données valides et l'ajoutons au tableau, et le détectons séquentiellement jusqu'à ce que nous rencontrions un retour chariot et un saut de ligne. À ce stade, nous considérons que la réception complète de la trame A, puis effectuons une vérification et d'autres traitements ; si une erreur telle que $CSE est envoyée dans les données, c'est-à-dire lorsque le Le quatrième bit d'erreur de transmission ne correspond pas à l'en-tête, ou la vérification échoue, nous pensons qu'une exception s'est produite dans les données, effaçons le tableau et continuons à recevoir et recherchons l'en-tête de trame. Et si nous enregistrions l’état actuel de la réception des données ? Puisque l'état a été mentionné, il est naturel de penser qu'il s'agit d'une machine à états, avec des sauts constants entre aucune donnée --- données - données complètes --- traitées --- aucune donnée. Cela peut donc être réalisé.

Ajoutons un peu plus de difficulté : que se passe-t-il si les formats de données sont divers, les longueurs sont différentes et les en-têtes et queues de trame sont différents ? Les méthodes mentionnées ci-dessus sont-elles toujours applicables ?

Permettez-moi d'abord de parler de ma compréhension. La méthode ci-dessus peut toujours être utilisée, avec quelques modifications et extensions. Tous les formats de données doivent être pris en compte et tous les en-têtes de trame possibles doivent correspondre aux données reçues. Tant que l'en-tête de la trame de données et la queue de la trame correspondent, elle est considérée comme une trame complète de données et une analyse de la somme de contrôle est effectuée par la suite.

Lorsqu'il existe de nombreux formats de données, il existe deux situations, l'une est interactive et l'autre est une réception pure. Comment éviter la duplication et les fuites est la difficulté. Ces détails dépendent de la mise en œuvre et de l’expérience de la programmation.

Qu'elle soit orientée processus ou orientée objet, la difficulté de mise en œuvre des fonctions ci-dessus est la même. Pour la fonction d'analyse de chaînes, nous recommandons la fonction strtok de la bibliothèque du langage C.

#include <string.h>
#include <stdio.h>
 
int main () {
   char str[80] = "This is - www.runoob.com - website";
   const char s[2] = "-";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );
    
      token = strtok(NULL, s);
   }
   
   return(0);
}

résultat de l'opération :

This is 
 www.runoob.com 
 website

C'est très pratique et facile à utiliser, mais veillez à ne pas franchir la limite du tableau de pointeurs, sinon un hardfault sera assez ennuyeux.

Guess you like

Origin blog.csdn.net/weixin_41579872/article/details/125258785