Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Quelle méthode pour gerer la réception UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » lun. 18 déc. 2017 22:07

Bonsoir à tous,

J'ai pris pour habitude de créer une machine d'état pour gérer la réception UART . Ainsi , quand je reçois une valeur, si c'est celle attendue je continue, si elle mauvaise je redémarre mon analyse.
Ça fonctionne plutôt bien mais c'est long. Le gros avantage que je vois, c'est qu'on à pas besoin d'avoir une fin de message . les caractères sont lus à la volée. Ca tombe bien mon module radio ne met pas de fin de transmission .

Je connais , il me semble, la méthode qui consiste à enregistrer tout un envoi dans un buffer, mais il faut avoir une fin de message pour savoir quand s’arrêter. Puis ensuite on compare le buffer avec une valeur de son choix pour savoir si c'est bon ou non .

Connaissez vous d'autre méthode, quand on a pas accès à un terminateur d'envoi autre que la machine d'état ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Quelle méthode pour gerer la réception UART
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 784
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#2 Message par paulfjujo » mar. 19 déc. 2017 13:07

bonjour,


On peut decider un arret de reception dans un buffer
- sur un nombre maxi d'octets ..
- si pas de reception pendant un certain timeout
- ou gerer un buffer circulaire , au risque d'ecraser les datas .

Ou ne rien gerer dans l'interrupt si ce n'est la progression d'un index dans le buffer de stockage des caracteres reçus,
mais en fonction de ce qu'on veut recuperer dans le programme, AGIR , puis razer le buffer et l'index de rangement dans le buffer.
c'est alors le main qui joue le role de synchro de l'UART.

Quelle méthode pour gerer la réception UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » mar. 19 déc. 2017 15:35

Bonjour ,

Merci Paul pour ces pistes de réflexion. Toutes sont bonnes, mais pas forcement adaptées suivant le contexte. Il faut faire un choix entre les avantages et les inconvénients.

paulfjujo a écrit :Source du message - sur un nombre maxi d'octets ..

Oui mais cela suppose qu'on sache exactement le nombre d'octets que l'on va recevoir et que ce chiffre ne change pas !

paulfjujo a écrit :Source du message - si pas de reception pendant un certain timeout

Oui c'est pas mal, mais la encore, pas évident a gérer plusieurs réception rapidement à la suite, car le time-out devra être court ! ca me parait compliqué à rendre fiable non ?

paulfjujo a écrit :Source du message ou gerer un buffer circulaire , au risque d'ecraser les datas .

Risque de couper une COM en 2 !

Dur dur comme choix !
Je pense qu'on a fait le tour des façon de traiter un UART.

Je vais cogiter un peu à tout ca !

Merci encore
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Quelle méthode pour gerer la réception UART
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 784
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#4 Message par paulfjujo » mar. 19 déc. 2017 17:19

dans tous les cas ,il faut definir un nb maximum d'octet , ne serait ce que pour definir
la taille du buffer de reception
ou alors utliser un buffer circulaire..

Quand on gere une reception .. on doit deja savoir qu'est-ce qu'on veut recuperer
qui doit etre reconnaissable dans un flux de donné

c'est comme laisser remplir sa boite aux lettre,
mais d'aller voir de temps en temps , si on a pas reçu la bonne lettre ,ou la mauvaise facture
de façon à eviter que la boite aux lettre déborde.

Cela implique donc forcement des regles de reconnaissance ( un protocole)
De plus tu es maitre de ce que tu envoies et recois des 2 cotés de ton application ?
Il faut eventuelement rajouter une entete de debut et de fin pour encadrer ,
reperer des datas specifiques du coté de celui qui emet.

ex: pour mettre mon horloge RTC , je recois U;JJ;MM;AA;JS;HH;MM#
si dans le flux je capte un U et que 19 pas plus loin j'ai un #
je recupere les bytes contenus entre ces 2 balises pour remettre à l'heure .
car JE SAIS que cela ne peut etre que la commande de remis à l'heure

L'important est surtout de capter le debut d'une arrivé de trame , en reception
pour se derouter de l'application main
si on connait sa longueur maxi , on peut attendre avec un delay ( Nb char * Vitesse bauds/10)
ou une evolution de l'index de rangement dans le buffer
en supposant que les trames soient suffisament espacée , pour que le MCU
puisse faire autre chose .
à 115200 bds , c'est pas coton..


Il faut connaitre quels sont les differents echange que tu veux gerer.
Taille des echanges et donc duree Maxi possible de trame.

il y a un equilibre à faire, entre le temps MCU dispo dans le main pour derouler le programme et autres evenements
et l'activité due aux interruptions 115200bs => 11520 interrupts par seconde rien que pour le RX UART.
La grande vitesse de COM n'est as forcément ce qui est le plus rentable ou fiable.

Quelle méthode pour gerer la réception UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » mar. 19 déc. 2017 19:05

Merci pour ces explications très claires !

En fait je souhaite une télécommande à tout faire, ou plutôt qui puisse servir dans plusieurs projets. ( robots , grue, voiture etc.... pour mes enfants).
Mon premier projet sera une voiture a 6 roues
Voila ce que je pensais faire . Dans ma tête je suis parti pour 16 octets à envoyer . en deux trames . Une trame prioritaire servant a piloter l'engin qui devra être envoyer environ 20 fois par secondes qui se compose de 8 octets ( pour les valeurs avant, arrière , droite et gauche , plus d'autres bricoles certainement) , et une seconde trame composer de 8 Octets, qui sera pour la télémétrie et les TOR .

Pour la partie télécommande le main sera :
Lecture de la position joysticks - conversions analogique/numériques puis envoie des infos au module radio ( peut etre lecture des TOR) pour envoi dans la même trame.
réception de la télémétrie en provenance du robot. puis envoie ( via l'autre UART) au deuxième PIC pour affichage sur l'écran.

Au final , il n'y a pas énormément d'octets à envoyer , un peu de conversions et de lecture TOR, et pas mal de communication entre le module Radio et le PIC dans les deux sens ( envoir et reception) et aussi avec le deuxième PIC IHM .

115200 s'est effectivement trop rapide. J'ai juste essayer pour les tests. Je vais réduire certainement à 38400 bauds qui doit etre plus raisonnable , et un bon compromis entre vitesse et fiabilité.
Le pic tourne à 64 Mhz

j'oublie certainement plein de choses c'est pour ça que je préfère voir large au départ .

C'est pour moi un défi et un rêve de gosse. Je sais que je ne fais les choses dans les régles de l'art. Mais il faut se ménager et faire que refléchir pendant des semaines c'est pas pour moi, il faut aussi que je joue du fer à souder et de la prog.

Donc je commence en ayant une idée mais sans trop savoir comment y parvenir.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Quelle méthode pour gerer la réception UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » mar. 19 déc. 2017 19:57

Re,

Après réflexion je pense que je vais commencer par la machine d'état que le commence à bien connaitre ! ce sera plus long à écrire mais , au final plus rapide et plus fiable , car je connais déjà.
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités