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 :

Lecture d'un port serie avec SerialPort [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut Lecture d'un port serie avec SerialPort
    Bonjour,

    Je viens vers vous car cela fait 2-3 jours que je me casse la tête à trouver un réponse et une solution à mon soucis.

    Je m'explique.

    Je fais actuellement un applicatif fonctionnant sur une liaison série RS232.

    La configuration du port se fait bien et l'envoie d'info également( A confirmé cf code).

    Je me sers d'un shunt sur mon port série reliant le TX au RX.

    Dans un premier temps je fais la demande de connexion, puis je fait une demande d par un checkbox et une validation.

    Mais hélas je n'arrive pas à avoir le retour.

    Un peu d'aide et / ou de correction ( Tout est possible) serai sympas.

    Code de connexion :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
       Private Sub ConnexionToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnexionToolStripMenuItem.Click
            'Barre de progression
            ToolStripProgressBar1.Value = 10
     
            'Chargement des paramétrages du port
            Port = My.Settings.Port
            Bits_par_secondes = My.Settings.BPS
            Bits_de_donnees = My.Settings.BDD
            Bits_D_arret = My.Settings.BDA
            Paritee = My.Settings.Parite
            Ctrl_Flux = My.Settings.Flux
     
            Select Case Ctrl_Flux
                Case "Aucun"
                    Ctrl_Flux = "0"
                Case "Xon / Xoff"
                    Ctrl_Flux = "1"
                Case "Matériel"
                    Ctrl_Flux = "2"
            End Select
     
            'Barre de progression
            ToolStripProgressBar1.Value = 20
     
            ' Create a new SerialPort object with default settings.
            _SerialPort1 = New SerialPort()
     
            ' Allow the user to set the appropriate properties.
            _SerialPort1.PortName = Port
            _SerialPort1.BaudRate = Bits_par_secondes
            _SerialPort1.Parity = Paritee
            _SerialPort1.DataBits = Bits_de_donnees
            _SerialPort1.StopBits = Bits_D_arret
            _SerialPort1.Handshake = Ctrl_Flux
     
            ' Set the read/write timeouts
            _SerialPort1.ReadTimeout = 500
            _SerialPort1.WriteTimeout = 500
     
            'Barre de progression
            ToolStripProgressBar1.Value = 30
     
            'Contrôle du port avant connexion
            Try
                With SerialPort1
                    'Ouverture du port
                    _SerialPort1.Open()
                    ToolStripProgressBar1.Value = 60
     
                    'Affichage de l'etat de connection
                    ToolStripStatusLabel1.Text = "Connecté"
                    Connection = "Connecte"
                    ToolStripProgressBar1.Value = 65
                    'Affichage de la commande de deconnexion et occultation de la commande connexion
                    DeconnexionToolStripMenuItem.Visible = True
                    ConnexionToolStripMenuItem.Visible = False
                    ToolStripProgressBar1.Value = 70
     
                End With
            Catch ex As Exception
                MsgBox("Le port : " & Port & " n'est pas disponible", MsgBoxStyle.Critical)
     
                'Affichage de l'etat de connection 
                ToolStripStatusLabel1.Text = "Déconnecté"
                Connection = "Deconnecte"
     
                ' Occultationde la commande de deconnexion et Affichage de la commande connexion
                ConnexionToolStripMenuItem.Visible = True
                DeconnexionToolStripMenuItem.Visible = False
            End Try
     
            'Définition de la date de la réalisation de la modification
            Dim Calendar As String
            Calendar = My.Computer.Clock.LocalTime.ToString("dd/MM/yyyy")
            'Sauvegarde de l'historique
            Dim sw As StreamWriter = New StreamWriter("Historique \" & "Historique.txt", True, System.Text.Encoding.Default)
            'met le contenu dans le fichier
            sw.Write(Calendar & " > " & Connection & " au port : " & Port & vbCrLf)
            'Ferme le fichier
            sw.Close()
            ToolStripProgressBar1.Value = 85
            ' Affichage de la modification
            Dim sw1 As StreamReader = New IO.StreamReader("Historique \" & "Historique.txt")
            RichTextBox1.Text = sw1.ReadToEnd()
            'Ferme le fichier
            sw1.Close()
            'Barre de progression
            ToolStripProgressBar1.Value = 100
            'Barre de progression
            ToolStripProgressBar1.Value = 0
        End Sub
    Code d’émission et de récupération
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     Public Delegate Sub _Affiche_ASCII(ByVal donnee As String)
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
     
            'Implantation de la valeur
            Emis = "A" & Emission.Text
            Console.Write(Emis)
     
            ' Lecture de la valeur émisse.
            Dim nb_octet As Integer = SerialPort1.BytesToRead ' on récupère le nombre d'octet présent dans le tampon
            Dim trame(nb_octet - 1) As Byte ' Tableau acceuillant les données au format byte
     
            SerialPort1.Read(trame, 0, 0) 'on lit le port
     
            Dim donnee As String = System.Text.Encoding.ASCII.GetString(trame) ' on récupère les données au format ASCII
     
     
            ' Label6.Text = Console.ReadLine
            'Définition de la date de la réalisation de la modification
            Dim Calendar As String
            Calendar = My.Computer.Clock.LocalTime.ToString("dd/MM/yyyy")
            'Sauvegarde de l'historique
            Dim sw As StreamWriter = New StreamWriter("Historique \" & "Historique.txt", True, System.Text.Encoding.Default)
            'met le contenu dans le fichier
            sw.Write(Calendar & " > Emission de : " & Emis & " dB " & vbCrLf)
            'Ferme le fichier
            sw.Close()
     
            ' Affichage de la modification
            Dim sw1 As StreamReader = New IO.StreamReader("Historique \" & "Historique.txt")
            RichTextBox1.Text = sw1.ReadToEnd()
            'Ferme le fichier
            sw1.Close()
     
        End Sub
    Les paramètres suivant sont au début de mon programme :

    Imports System.IO
    Imports System
    Imports System.IO.Ports
    Imports System.Threading

    Merci d'avance.

    Cordialement

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    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 194
    Par défaut
    de mémoire j'aurais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SerialPort1.Read(trame, 0, trame.count)
    plutot que 0,0
    enfin l'intellisense va te dire ce qu'il faut mettre en 3ème paramètre, si c'est un count 0 ne convient pas ...

    si c'est toujours pas mieux tu peux faire un thread.sleep(50) entre l'écriture et la lecture, car on ne sait pas ce qui se passe matériellement dans les buffers ...

    tu peux aussi faire du pas à pas / point d'arret pour voir ce que vaut nb_octet deja
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut Suite #1
    Bonjour,

    Merci Pol63 pour ton aide ma permis d'avoir un retour, ce qui dans un premier temps génial donc un grand merci.

    Mais( Oui il y a un "Mais"), je n'ai pas la valeur émise. Je me retrouve avec des petits carrées vide.
    Comme si la récupération ne comprenais pas ce quel reçoit.
    Pour 0.0, j'ai 4 carrées ( Oui car lors de l'émission j’envoie "A" & 0.0, soit 4 caractères donc 4 carrées.

    J'ai essayé :
    #1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim donnee As String = System.Text.Encoding.ASCII.GetString(trame)
    #2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim donnee As String = System.Text.Encoding.Default.GetString(trame)
    #3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim donnee As String = System.Text.Encoding.Unicode.GetString(trame)
    #4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim donnee As String = System.Text.Encoding.UTF32.GetString(trame)
    #5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim donnee As String = System.Text.Encoding.UTF8.GetString(trame)
    #6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim donnee As String = System.Text.Encoding.UTF7.GetString(trame)
    Et dans tous les cas, aucun retour de la valeur émise quelque soit le codage ou là valeur émise.

    Proposition :

    En voyant que l'on fait un codage lors de la lecture, ne faut il pas faire de même à l’écriture?
    Si oui comment, j'ai essayé en m'inspirant de la même méthode que la lecture mais sans grand succès.

    Un pti coup de pouce ,ou un avis pour m'orienter serai la bienvenue.

    Merci d'avance.

    Cordialement.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    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 194
    Par défaut
    oui c'est le truc, mais je ne vois pas où tu écris dans le port série dans le code que tu as mis ...

    l'objet serialport permet d'envoyer des octets ou des strings, et j'ai déjà eut des soucis en envoyant des string directement, il vaut mieux dans tous les cas envoyer des octets
    après un string converti en octet l'est différemment selon le codage
    il doit y avoir System.Text.Encoding.ASCII.GetBytes(unstring)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut Suite #2
    Encore Merci Pol63,

    Mais là je suis dans le flou total, je pense avoir besoins d'explication et d'aide pour comprendre la chose.

    Le code d’émission est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     'Implantation de la valeur
     
            Emis = "A" & Emission.Text
            SerialPort1.Write(Emis)
            Thread.Sleep(50)
    Essais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     'Implantation de la valeur
            Emis = "A" & Emission.Text
            System.Text.Encoding.ASCII.GetBytes(Emis)
            SerialPort1.Write(Emis)
     
            Thread.Sleep(50)
    Sans grand succès.

    Une explication serai la bienvenue si cela te dérange pas???

    Merci d'avance.

    Cordialement.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    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 194
    Par défaut
    il faut bien faire la différence entre une méthode et une fonction
    les 2 s'appelent et exécutent du code, mais une fonction retourne une valeur
    l'intellisense (autocomplétion et aide qui va avec) de vb est bien faite, en tapant System.Text.Encoding.ASCII.GetBytes ca te précise que getbytes et une fonction qui retourne un tableau d'octet et qui demande en paramètre un string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Text.Encoding.ASCII.GetBytes(emis)
    va donc retourner un tableau d'octet mais tu ne le stockes nulle part ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim bytesToSend as byte() = System.Text.Encoding.ASCII.GetBytes(emis)
    de plus vu que tu fais SerialPort1.Write(Emis) après, ca envoie le contenu de Emis qui est un string
    il n'y a rien d'implicite dans le code, et une variable ne peut pas changer de type
    => Write(bytesToSend)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/03/2010, 11h51
  2. Acces et lecture Port serie avec Windows Seven
    Par Naklov dans le forum VB.NET
    Réponses: 7
    Dernier message: 14/12/2009, 19h40
  3. Réponses: 3
    Dernier message: 08/04/2009, 14h48
  4. communication port serie avec GTK+?
    Par cguignol dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 28/06/2007, 11h15
  5. Communication port serie avec un microcontrolleur
    Par crazydede8 dans le forum C
    Réponses: 4
    Dernier message: 29/07/2006, 14h49

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