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écouper une trame série RS232


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    Par défaut Découper une trame série RS232
    Bonjour,

    J'ai une machine reliée sur le port série de mon PC qui m'envoie une trame de données de 5 octets plusieurs dizaines de fois par seconde :

    0D 02 59 01 F2

    (c'est un exemple, la trame est en hexadécimal, j'ai séparé les octets par un espace pour que ce soit plus visible)

    Le premier octet est le délimiteur de début de la trame : il est toujours le même (0D)

    Le 2eme et 3eme octet (02 59) représentent une valeur qui va de 0 a 65535, le 2eme octet est donc l'octet de poids fort et le 3eme l'octet de poids faible (cela donnerait 601 en décimal donc)

    Le 4eme octet (01) est une autre valeur qui va de 0 à 255 (ici 1).

    Et le 5eme octet (F2) est une autre valeur qui va de 0 à 255 (ici 242).


    La question est que je ne sais pas comment scinder cette trame, j'aimerais récupérer les 3 valeurs utiles dans des variables utilisables par VB (genre VarA, VarB, VarC as integer) et qu'elles soient actualisées a chaque variation des variables dans la trame.
    Merci

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    quand tu recois des octets, tu les ajoutes dans une collection (list(of byte))
    juste après (dans la même méthode donc) tu regardes si la collection contient au moins un octet de début de trame et 4 octets derrière (boucle sur chaque item)
    si c'est pas le cas tu ne fais rien (ca peut arriver, la réception des octets peut parfois se faire sur plusieurs events, bien que dans ton cas ca devrait être rare)

    si tu as une trame complète tu peux alors découper et traduire les données
    suppression des éléments avant l'octet de début ; ca peut paraitre étrange mais c'est pour coder propre
    si tu reçois 2 trames donc une a été parasité et l'octet de début a été modifié (un cable série ca peut bugger, et il n'y a pas forcément de correction d'erreur) alors tu va te retrouver avec quelque chose d'erroné, il faut donc bien commencer la lecture à l'endroit du 1er caractère de début trouvé
    traduction des 5 octets, puis suppression de ceux ci de la collection

    pour la traduction, il y a bitconverter.getint16 qui devrait te servir


    après tu mets tout ca dans une classe avec un songleton, des propriétés pour les données, et une propriété avec la date de dernière lecture réussie
    comme ca tu pourras aussi savoir si le dialogue fonctionne toujours
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre habitué
    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
    Par défaut
    Merci mais ça m'a l'air un peu compliqué pour ce que je veux faire

    En fait j'ai une routine qui tourne en fond et me lit chaque ligne de mon port série (délimitée par le caractère ASCII "0D" donc) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Private Sub rxthread_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles rxthread.DoWork
     
            Do While serialport.IsOpen
     
                serialport.NewLine() = ChrW(13)
                rx = serialport.ReadLine()
     
            Loop
     
        End Sub
    Donc l'idée serait de découper "rx"

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    développer ce n'est pas toujours une ligne de code simple qui fait tout ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué
    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
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    développer ce n'est pas toujours une ligne de code simple qui fait tout ...
    Eh oui je sais bien, vu que j'ai développé le firmware de ma machine sur microcontrolleur... le truc c'est que la programmation sur microcontrolleur (interruptions, etc) est bien différente de la programmation sur PC que je trouve trop "abstraite" (surtout avec les outils Microsoft).

    Alors je t'avoue que je ne veux pas trop perdre de temps sur VB, surtout que c'est pas la lune ce que je veux faire, je veux juste afficher mes valeurs dans une fenêtre

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    je sais ce que c'est, moi je galère sur des arduinos car je trouve ce langage trop bas niveau alors que la programmation PC je trouve ça simple, surtout avec les outils microsoft ^^
    (comme quoi tout est subjectif)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
       serialport.NewLine() = ChrW(13)
     
       While serialport.IsOpen
                Dim rx = serialport.ReadLine()
                Dim bytes = System.Text.ASCIIEncoding.ASCII.GetBytes(rx)
                If bytes.Count <> 5 OrElse bytes(0) <> &H0D Then Continue While 'trame érronée on ne la traite pas
     
                Dim v1 = BitConverter.ToInt16(bytes, 1)
                Dim v2 = bytes(3)
                Dim v3 = bytes(4)
     
                ' via le backgroundworker on est sur un thread secondaire, qui n'a pas le droit de modifier l'interface, donc il faut passer par me.invoke
                Me.Invoke(Sub()
                              Me.label1.text = v1.ToString
                              ' ...
                          End Sub)
         End While
    et tu n'avais pas précisé que ta trame se finissait par un chr13
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [PIC] Capture d'une trame série
    Par lcoulon dans le forum C
    Réponses: 1
    Dernier message: 18/04/2009, 18h52
  2. Réponses: 1
    Dernier message: 08/03/2009, 18h55
  3. Affichage incomplet après réception d'une trame via RS232
    Par sroge dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/02/2008, 16h50
  4. acquerir une trame nmea rs232(serie)>PIC
    Par strygolw dans le forum C
    Réponses: 7
    Dernier message: 06/05/2007, 15h17
  5. 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, 19h14

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