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 port série


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut Lecture port série
    Bonjour à tous,
    J'ai un capteur de température connecté à un microcontrôleur, le programme m'envoie une variable codée sur 8 bits. Bref un nombre entre 0 et 255
    Je souhaite recevoir le contenu de cette variable dans un label. J'ai bien trouvé un code et essayé de l'adapter...
    Pour les essais je mets un potar sur l'entrée du micro, ai testé le programme en simulation, il fonctionne. Le potentiomètre délivre une valeur allant de 0 à 255..
    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
     
    Imports System.IO
    Imports Strings = Microsoft.VisualBasic 
     
    Public Class Form1
        Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer) 
        Dim WithEvents serialPort As New IO.Ports.SerialPort 
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Timer1.Enabled = True
            Timer1.Interval = 5000
            Array.Clear(RegistreMicro, 0, 2) 'effacer le tableau, j'ai mis 2, sans savoir...
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Call SerialTxRx() ' talk to picaxe
        End Sub
     
        Sub SerialTxRx()
            Dim LabelContenu As String
            Dim Donnee(0 To 1) As Byte '1donnée qui doit être reçue?
            Label1.Text = "" 
     
            If serialPort.IsOpen Then
                serialPort.Close() 
            End If
            Try
                With serialPort
                    .PortName = "COM3" 
                    .BaudRate = 4800 
                    .Parity = IO.Ports.Parity.None 
                    .DataBits = 8 
                    .StopBits = IO.Ports.StopBits.One
                    .ReadTimeout = 1000 
                    .Open() 
                    .DiscardInBuffer() 
                    Call Sleep(500) 
    'C'est ici que je souhaiterai lire les données
    'La méthode Read?
    '.Read(buffer, offset, count)
    'buffer : Tableau d'octets dans lequel l'entrée doit être écrite.
    'offset : Offset dans le tableau de la mémoire tampon à partir duquel 'commencer l'écriture.
    'count : Nombre d'octets à lire
    '.Read(Donnee, 0, 1) ?
     
                    .Close() ' close the serial port
                End With
    'Ici l'affichage ?        
    'LabelContenu = Str(Donnee(1)) 
    'Label1.Text = LabelContenu 
     
                Label1.Text = "Timeout" 
            End Try
        End Sub
    End Class
    Ayant pas mal trifouillé depuis 2 jours, je me laisse tenté par un forum, là je ne sais plus quoi faire... des fois cela ne m'affiche rien : timeout ou alors juste une valeur et une seule "240"
    Bref, si vous pouviez m'éclairer...
    Merci
    lio59

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    Si tu ferme et ouvre ton port en permanence tu va effectivement perdre les données qui ont déjà été reçues et ne pas recevoir celle qui arriveront lorsque le port est fermé.

    De plus l'utilisation de Sleep suspend l'execution de ton programme et donc aussi la reception des données sur ton port.

    Modifie ton code ainsi :


    • Met l'ouverture du port dans le Form_Load. Pas de Sleep
    • Dans le timer, tu met seulement la lecture et l'affichage des données, avec au préalable une vérification si des données ont été reçues. S'il n'y a pas de données, il n'est pas nécessaire d'essayer de les lire.
    • Pense à prévoir aussi la fermeture du port avant de quitter le logiciel, dans le Form_Closing par exemple. Sinon le port restera ouvert et ne sera plus accessible pour ton logiciel.

    La variable contenant ton objet SerialPort devra être globale pour que ça marche.


    Version alternative :
    A la place d'un timer pour vérifier la réception et lire les données, tu pourrais aussi utiliser l'évènement de réception déclenché par l'objet SerialPort. Ça complique un peu la partie affichage car cet évènement n'est pas déclenché dans le même thread que le reste du code et donc le label n'est pas directement accessible depuis cet évènement. Il faudra passer par un délégué pour faire cet affichage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Merci sevyc64 pour ces conseils, je m'y atteler la semaine prochaine...

    J'ai cru lire que l'on pouvait utiliser différentes méthodes pour lire et écrire sur le port série. Cette première esquisse vous semble une bonne méthode à savoir la méthode RxTx, il n'est pas utile de mettre un fichier dans system32 de l'ordinateur?
    Merci
    à bientôt
    lio59

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    Citation Envoyé par lio59 Voir le message
    ... il n'est pas utile de mettre un fichier dans system32 de l'ordinateur?
    Tu fais certainement référence à MSCOMM32.ocx. Cela n'est pas nécessaire. mscomm32.ocx était valable pour les anciennes versions de VB. Maintenant tout est inclue dans le framework pour le port série, il n'y a rien à rajouter.
    Tu utilise la bonne classe.

    Pour lire, tu as 2 méthodes, la méthode du polling et la méthode évènementielle

    - Le polling (attente active en français), c'est ce que tu avais commencé à utiliser. Ça consiste à attendre la réception des données en allant vérifier régulièrement si elles sont pas arrivées.
    - La méthode évènementielle, consiste à traiter la réception des données lorsque l'évènement de réception est déclenché par le port série. C'est la version alternative que je t'avais décrit.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Merci pour cette réponse détaillée. Me voilà donc rassuré. Me reste à dégager du temps pour réaliser cette interface. Je fais cela pour moi et pour, en même temps, me former à vb.net... bref un objectif...
    Mais votre premier message, me donne des pistes de réflexions. Encore merci...
    Je ne donnerai pas signe de vie avant une dizaine de jours, mais ne manquerai pas de vous faire part de mon avancée.
    Merci à vous
    à bientôt
    lio59

Discussions similaires

  1. Lecture port série
    Par mickael.be dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/07/2008, 10h49
  2. lecture port série
    Par biscot19 dans le forum C
    Réponses: 6
    Dernier message: 13/07/2007, 09h54
  3. lecture port série
    Par alex2395 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/03/2007, 16h59
  4. [API Win32 sans MFC] Lecture port série: thread bloqué
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/05/2006, 14h34
  5. Pb de lecture port série
    Par amalis dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 18/03/2006, 17h21

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