IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Découpage trame série RS232


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 2
    Points
    2
    Par défaut Découpage trame série RS232
    Bonjour à tous,

    Nouveau sur ce forum et sur VB Express 2010, je suis en train de faire un programme permettant de piloter mon variateur de vitesse via mon PC.

    J'ai besoin de lire des infos envoyées par mon variateur (tension, courant, température, fréquence etc) et de les afficher sur la fenêtre de mon programme.

    Mon variateur est relié en RS232 sur mon port série, et m'envoie des trames de données comme ceci, toutes les 500ms, sur le port COM1 (sans les espaces) :

    0000 0000 0000 0000 0000 0 0

    1er groupe de chiffres : tension (va de 0000 à 1023)
    2éme groupe de chiffres : courant (va de 0000 à 1023)
    3éme groupe de chiffres : température (va de 0000 à 1023)
    4éme groupe de chiffres : référence (va de 0000 à 1200)
    5éme groupe de chiffres : fréquence (va de 0000 à 1200)
    6éme groupe de chiffres : variable 1 (va 0 à 1)
    7éme groupe de chiffres : variable 2 (va de 0 à 1)

    A noter que le nombre de chiffres est fixe, c'est à dire que la trame contient toujours 22 chiffres.

    Donc j'aimerais "découper" cette trame afin de récupérer mes 7 variables, et les afficher sur mon programme en temps réel (sachant que les valeurs de la trame varient constamment, toutes les 500ms).

    Merci d'avance

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Tu n'as rien qui identifie le début et/ou la fin de trame ?
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    Tu n'as rien qui identifie le début et/ou la fin de trame ?
    Si, chaque trame fin de trame est identifié par un Carriage Return (code ASCII hexa "0D").

    C'est pour ça que dans Hyperterminal je reçois mes données arrangées de cette manière :

    0125012710221000060001
    0145013710211000020010
    0125013610211000020000

    etc...

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Ok, dans ce genre de cas (réception continue), ce que, perso, j'ai appris à faire c'est mettre en place un buffer circulaire à double index.

    En gros tu as, en variables communes, un tableau d'octets, ou de caractères, ici, et 2 index (variables de type entier).

    Le tableau devra être suffisamment grand pour diminuer les risques d'écrasement (minimum l'équivalent de 10 trames). ici, tu peux partir sur un tableau de 2048 caractères par exemple, c'est pas trop grand mais largement plus que tes trames.

    Ensuite tu as un index, on va dire IN qui va indiquer à quel indice remplir le tableau. Tu as un autre index, qui va, lui, indiquer à quel indice dans le tableau, lire le caractère suivant.

    Ensuite une tache réception, indépendante, l'évent du sérialport en vb, qui va remplir le tableau aveuglément à chaque caractère reçu. Chaque caractère écrit dans le tableau doit incrémenter l'index IN de 1. Si l'index IN dépasse la fin du tableau il est remis à 0 pour continuer au début (c'est l'effet circulaire).

    Ensuite tu as une seconde tache, le programme principal par exemple, qui va venir tester la différence entre l'index IN et l'index OUT. S'ils sont différents c'est que tu as des caractères non lus dans le tableau.
    Le principe est que tu lis le caractère à l'indice "OUT" pour le traiter et tu incrémente l'index OUT. Même principe, si tu dépasse la fin du tableau tu continue au début.


    Dans ton cas particulier, tu va avoir une phase d'initialisation, qui va consister à lire et ignorer chaque caractère, jusqu'à avoir lu un x0D indiquant la fin d'une première trame (probablement incomplète). Une fois synchronisé, soit tu lis les 23 caractères suivants (22+ x0D) que tu redécouperas en fonction de tes groupes ensuite, soit tu lis successivement chacun de tes groupes. Sachant que, que se soit la lecture de la trame complète, ou groupe par groupe, la lecture peut se trouver à cheval sur la fin du tableau. Tu peux donc avoir à lire, par exemple, 3 caractères à la fin du tableau et le 4ème eu début, pour reconstituer ton groupe. c'est un cas à gérer.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    (...)
    lu en diagonale, mais !?


    si tu as un string qui contient tout ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim tension = cint(lestring.substring(0,4))
    dim courant = cint(lestring.substring,4,4))
     
    'etc...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Comment capturer les données sur une liaison série RS232
    Par jef Orome dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 02/04/2007, 18h14
  2. Communication port série (RS232) avec VC++
    Par sanatou dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/10/2006, 13h49
  3. Configuration Port Série (RS232)
    Par Bmagic dans le forum MFC
    Réponses: 2
    Dernier message: 07/07/2006, 10h18
  4. probleme port série rs232
    Par bob75018 dans le forum Langage
    Réponses: 1
    Dernier message: 30/01/2006, 17h20
  5. [Debutant(e)] Liaison série RS232 et servlet
    Par bourack dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/01/2005, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo