Parser ce qui arrive sur le port serie

zn415 Messages postés 62 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 21 novembre 2015 - 2 juil. 2013 à 14:03
jibob Messages postés 59 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 4 juillet 2013 - 4 juil. 2013 à 12:50
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

jibob Messages postés 59 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 4 juillet 2013
2 juil. 2013 à 19:19
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
0
zn415 Messages postés 62 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 21 novembre 2015
4 juil. 2013 à 04:12
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
0
jibob Messages postés 59 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 4 juillet 2013
4 juil. 2013 à 12:50
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
0
Rejoignez-nous