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ébutant: aide sur port série


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Débutant: aide sur port série
    Bonjour,

    J'aurai besoin d'un petit coup de main à propos de l'utilisation du port série sous visual basic express 2008. Je précise que je suis débutant.

    Je souhaite envoyer une trame de bytes à un appareil, puis recevoir des données qu'il est sensé m'envoyer. Voici un bout de code correspondant:
    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
    19
    20
    21
     
    'Déclaration de la trame de bytes
    Dim commande() As Byte = { &H2, &H1, &H43, &H57, &H47, &H54, &H32, &H3, &H0, &HD, &HA}
     
    If SerialPort1.IsOpen = False Then
        SerialPort1.Open()
    End If
     
    'je récupère la taille du buffer du port
    tampon = SerialPort1.ReadBufferSize
    Label1.Text = "Taille de la mémoire tampon:" + CStr(tampon) + "octets"
     
    'Création du fichier pour récupérer les données (de la taille de la mémoire tampon)
    Dim fichier_byte(tampon-1) As Byte
    'Envoi de la commande sur le port
    SerialPort1.Write(commande, 0, 11)
    'lecture de la réponse
    SerialPort1.Read(fichier_byte, 0, tampon)
    'Conversion de fichier_byte en string
    Dim fichier As String = BitConverter.ToString(fichier_byte)
    Label2.Text = "Données reçues:" + fichier
    Je précise que je ne peux pour l'instant pas connecter l'appareil au port, donc impossible de tester la réponse. Mais j'aurais voulu voir le contenu du buffer actuel, pour voir si j'arrive bien à lire son contenu. Mais le programme plante au niveau de la conversion du type Byte en string. Pouvez vous me donner une solution, afin que je puisse afficher dans un label le contenu de mon buffer ?

    Autre question, j'aimerais savoir comment réinitialiser le buffer du port, pour pouvoir lire des réponses à différentes commandes en étant sur de ne pas récupérer de vieilles données ? Quelle est la différence entre SerialPort1.Read et SerialPort1.ReadLine (j'ai cherché, mais n'ai pas compris) ?

    Enfin, si vous avez des commentaires sur ma manière de procéder, n'hésitez pas, je suis totalement débutant. Merci d'avance

  2. #2
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    je ne vais sans doute pas t'aider beaucoup,
    je peut seulement te dire que la trame ne se lit pas en continue,
    tu a un évément pour sa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
     
            SerialPort1.Read(...)
     
        End Sub
    pour le reste, je pense qu'il serrait plus simple que tu fasse des test en temps réel,
    plutôt que d'essayer de lire le tampon

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette réponse.

    A l'ajout de l'outil SerialPort, la procédure SerialPort1.Data_Received, mais je l'ai laissée vide, incorporant SerialPort1.Read dans un événement Button1_Click (j'ai passé SerialPort1.Data_Received en public). Cela pose-t-il un problème ? Au débogage, rien ne m'est signalé en tout cas.

    Il me semblait obligatoire de lire la mémoire tampon du port, étant donné que SerialPort1.read prend en argument un offset dans le tableau de la mémoire tampon.

  4. #4
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    je suis pas ton raisonnement

    la fonction SerialPort1_DataReceived
    se déclenche dés que quelque chose arrive sur ton SerialPort
    et est en accord avec ton protocole


    je te montre une exemple d'utilisation si tu veut
    je sais que je dois lire une trame sur 8 octets, donc je la lit a la récéption comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub spRS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles spRS232.DataReceived
     
            Dim budd(8) As Byte
     
            spRS232.Read(budd, 0, 8)
            spRS232.Close()
     
        End Sub
    je ne me suis jamais attardé a lire le tampon, donc comme je t'ais dit je te serrais pas d'une grand aide ...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci
    D'accord, je n'avais pas réalisé que SerialPort1_DataReceived se déclenchait automatiquement à l'arrivée de données sur le port.

    Mais le problème, c'est que dès qu'un bloc va arriver, il va effacer le contenu de ton budd. Moi j'aimerais bien les conserver ces données ! Est ce qu'un truc comme ça peut fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'Déclaré en global dans ma classe
    Dim fichier_byte()() As Byte
    Dim a As Integer = 0
     
    Public Sub SerialPort1_DataReceived(ByVal sender As Object, By Val e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
     
    SerialPort1.Read(fichier_Byte(a), 0, 7)
    a=a+1

    Pour moi avec ce code, dans mon tableau de données fichier_byte, on changera de ligne à chaque fois que des données arriveront sur mon port. Du coup je pourrai les conserver. Juste ?
    Le problème c'est que la longueur des trames à lire va surement changer.

  6. #6
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    dès qu'un bloc va arriver, il va effacer le contenu de ton budd.
    ah wii, mais je t'ais donné un code simplifié

    je suis pas sur que comme tu ais fait, il soit d'accord ....
    il doit te dire que ton tableau fichier_byte() n'est pas dimensionné *non ?*

    sinon wii c'est sa,
    je ne vois pas la finalité mais en déclarant en globale tu gardera tes trames reçues

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je suis de retour, avec de nouveaux problèmes !
    Grande nouvelle cependant, j'arrive à envoyer ce que je veux à l'appareil et il me comprend !

    Le truc qui me bloque, c'est toujours la réception des données. Je veux pouvoir stocker ce que l'appareil m'envoie dans un fichier texte. J'ai donc pensé à définir un tableau, avec en ligne chaque trame, et en colonnes chaque octet de chaque trame.

    1. Alors deja, au niveau de la manip des tableaux, j'ai beau chercher, je trouve rien de très clair. Est-ce juste, pour un tableau à 2 dimensions de int, sachant que je ne connais pas à l'avance sa dimension:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim tableau()() as integer
    et pour voir les données d'une case du tableau:

    ?


    2. Mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim tableau()() As Byte
    .
    .
    .
    Public Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Dim nbre_octets As Integer = SerialPort1.BytesToRead
    'écrit à la ligne a de mon tableau        
    SerialPort1.Read(tableau(a), 0, nbre_octets) 'BUG !!!!!!!
    'pour écrire sur la ligne suivante        
    a = a + 1
    Et voici l'événement Button_Click pour lancer l'envoi et la réception des données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    'J'envoie ma commande à l'appareil        
    Envoi("azerty")
    'je souhaite vérifier que la réponse du sonomètre est un acknowledge et pas un not acknowledge. Normalement cette ligne du tableau est remplie puisque SerialPort1_DataReceived se met en marche dès l'arrivée d'un byte sur le port
            If tableau(0)(2) = &H6 Then  'BUG !!!!!!!!!
                Label2.Text = "Commande reconnue"
            Else tableau(0)(2) = &H15 Then
    Label2.Text = "Commande non reconnue"
            End If
        End Sub
    Au niveau des BUG, il me dit:

    L'exception System.NullReferenceException n'a pas été gérée
    Message="La référence d'objet n'est pas définie à une instance d'un objet."
    Je comprends pas, malgré mes recherches ce que ça signifie.
    Je me suis dit que la case ligne 0 colonne 2 du tableau ne s'écrivait pas tableau(0)(2) mais tableau(0,2), mais à ce moment là il me dit que "le nombre d'indice est supérieur à celui du tableau indexé".

    Bref, je sais pas. J'ai besoin d'aide avec de poursuivre mon programme en justice pour harcèlement moral. Merci d'avance

Discussions similaires

  1. envoi tableau de data sur port série
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2005, 16h23
  2. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50
  3. Recevoir "NULL" sur port série
    Par WinY57 dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 04/03/2005, 11h37
  4. Etat de CTS sur port série
    Par Juste_Une_IlluZion dans le forum C++Builder
    Réponses: 9
    Dernier message: 12/09/2004, 10h46
  5. [Débutant] Réception sur port série
    Par Tophe59 dans le forum Langage
    Réponses: 43
    Dernier message: 28/06/2004, 11h04

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