Parser ce qui arrive sur le port serie

Signaler
Messages postés
62
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
21 novembre 2015
-
Messages postés
59
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
4 juillet 2013
-
Bonjour, je travaille sur un petit logiciel qui servira à piloter une tondeuse automatique. (http://www.electronika.fr/blog/?cat=421 )

Pour cela mon microcontroleur envoi sur le port série ceci:

C'est moi qui est choisi le format:

[pos:255] retour a la linge a chaque fois (\n\r)
[stop:1]
[vitesse:44]
[cap:133]
....

J'ai déja tenté et reussi a récuperer et afficher mes données mais je trouve ma technique trop brouillon.

Voici comment je faisais jusque la:



  'on enleve les blancs du debut et de la fin
     'Text1.Text = Trim(Text1.Text)
     
    
    Dim a As Variant
    a = Split(Text1.Text, vbCrLf)  'je recupere chaque ligne
    nb_tableau = UBound(a) ' je compte combien y a de case dans le tableau
    

'ci dessous je gere le cas ou le tableau est vide, au depart
    If nb_tableau = 0 Then
     Text3.Text = a(nb_tableau)
    Else
       'Text3.Text = a(nb_tableau - 1)'je recupere la derniere ligne
    End If
    
    


    Dim b As Variant
    b = Split(Text3.Text, "bat1:")

    If (UBound(b) = 0) Then
        Text3.Text = 0
     Else
       Text3.Text = b(1)
        Text3.Text = Replace(Text3.Text, "[", "")'j'enleve [
        Text3.Text = Replace(Text3.Text, "]", "") ' j'enleve ]
     End If




Voila comme je fais jusqu’à maintenant,j'aurais aimé que le traitement supporte aussi le cas ou il n'y aurait pas le crocher [ ou ] de séparation car toutes ces données viennent d'un port radio donc il peu y avoir des défaut de transmission

Merci d'avance

3 réponses

Messages postés
59
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
4 juillet 2013

Bonjour,

Comme tu choisis le format, le mieux c'est d'enlever les crochets qui n'ont pas d'utilité réelle.

Donc traiter ligne par ligne, c'est comme si tu lisais chaque ligne d'un fichier texte, il n'y a pas de difficulté en faisant un Split du caractère séparateur (:)
d'un côté tu isoles le nom de la variable, de l'autre son contenu.

Tu peux ainsi répertorier tous les nom des variables dans une liste pré-établie et il est ensuite facile de leur affecter leur valeur.

Tu peux en premier lieu activer la parité du port série afin de vérifier chaque caractère reçu (ceci garantit qu'un bit unique n'a pas été altéré, mais au delà, la parité peut être juste et néanmoins le caractère altéré).
Reste à fiabiliser la transmission avec un CRC que tu calculerais pour chaque ligne et que tu placerais en début de ligne (ou après le séparateur) de manière à pouvoir le retrouver à coup sûr.
En cas de mauvais CRC, tu jetes la ligne entière car altérée.

Cordialement
Messages postés
62
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
21 novembre 2015

Effectivement je me suis compliqué la vie pour rien, je vais faire comme conseillé.
J'ai déja programmé en php des expression regulieres et j'aurais aimé faire le même genre de chose:

Genre verifier que ma ligne commence bien par 4 lettres comporte un ":" et que aprés ces ":" il y a bien entre 1 et 5 caractere par exemple.

Je vais voir si mon module radio peut supporter la parité et pour le crc c'est une bonne idée.


Je vais tester tous ça prochainement
Messages postés
59
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
4 juillet 2013

Bonjour,

Tu n'as nullement besoin de faire appel aux expressions régulières, car tu sais d'avance ce qui est attendu, à savoir un nom de variable, un séparateur, une chaine CRC, un second séparateur et la chaine de valeur.

Inutile de multiplier les contrôles, vérification de la chaine CRC, si la ligne est OK, décoder le texte de la variable et la valeur puis affecter la valeur à la variable.
Cela se code en quelques lignes et ne nécessite pas de vérifier un format strict puis que le CRC a déjà fait le travail

Au cas où le module radio ne supporterait pas la parité, il suffit de communiquer sur 7 bits, format suffisant pour le code ASCII.

Cordialement.


Ne pas oublier le bouton "Réponse acceptée" pour clore ce sujet