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 com


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut lecture port com
    Bonjour,

    je pense que je n'ai pas posté ce message dans le bon forum, c'est pourquoi je me permet de le replacer ici, j'espere que les modérateur m'excuseront.

    donc voici mon probleme:

    j'ai fait un petit programme en vb pour lire des code venant d'un pic(16F628A),
    celui-ci m'envoi des code hexa qui sont interpreter en ascii par le pc,
    je les transforme en suite en code decimale que j'affiche dans un label.

    le probleme est que tout les code envoié supérieure à 128 decimale sont considérer par le pc comme des "?" (code ascii 63).

    j'ai vu que la fonction de lecture readexisting me rend une chaine de ce type:
    "??345678" les 2 "?" correspondant au code hexa 129 et 130.

    que puisje faire pour régler ce probleme afin de pouvoir afficher 129 et 130 dans mon label?


    voici la configuration de ma variable port Com de mon formulaire FormStart:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FormStart.Com = My.Computer.Ports.OpenSerialPo rt(Me.ComboBox1.SelectedItem)
    FormStart.Com.BaudRate = 9600
    FormStart.Com.Parity = IO.Ports.Parity.None
    FormStart.Com.DataBits = 8
    FormStart.Com.StopBits = 1
    FormStart.Com.Handshake = IO.Ports.Handshake.None
    et voici comment je lis le port com:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    receive_string = Com.ReadExisting
    merci pour votre aide.

  2. #2
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Je ne comprends pas trop, tu dis que ton Pic t'envois des codes hexadécimaux, la chaine que tu donnes en exemple (??345678) ne correspond pas à ça. D'où vient-elle ? C'est une chaine de code hexa que ton programme a déjà traduit en caractères ASCII ?
    Que veux tu afficher au juste 129 et 130 ou les caractères dont le code ASCII est 129 ou 130 ?

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    essaye de travailler en octet et de transformer après
    donc readbytes au lieu de readexisting (et sendbytes)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    Les code envoyer par le pic sont en hexadecimal,

    j'ai vu qu'il était interpreter par le pc (code vba) avec readexisting comme des code ascii

    voici la string envoier par le pic en decimale " 128 129 51 52 53 54 55 56"
    ou en hexa "80 81 33 34 35 36 37 38"

    c'est pourquoi la chaine que je recois est "??345678" car avec readexisting on recois une string.

    le code envoier par le pic 129 decimal (ou 81 hex) donne ? (caractere ascii) pour le vba
    51 decimal (ou 33 hex) donne 3 (caractere asii) pour le vba

    mon probleme est donc que j'envoi un code hexa qui est interpreter comme code asii par mon programme vba, j'arrive a convertir grace à la fonction ASC() le caratere asii en code decimal, mais cela ne fonctionne plus pour les code hexa superieure à 7F hex ou 127 decimal.

    je vais essayer avec read byte.

    merci pour votre aide.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    voila j'ai essayer aver redbyte et cela fonctionne mieux, merci.

    mais j'ai un autre probleme.

    je recois du pic une trame de 8 bytes toutes les 20 ms + ou -.

    les code recus s'ajoute donc constament dans le buffer de reception, ce qui me donne une enorme trame apres seulement quelque seconde "128 51 52 53 ..."

    le pic termine toujours une trame par 13 dec (CR = retour a la ligne)

    je test donc le debut de la trame en attendant le code 13 pour ensuite debuter la lecture des 8 bytes à la suite l'un de l'autre.

    le probleme est que lorsque j'arrette le pic le code vb continue a afficher les trame car le buffer n'est pas vide.

    comment puisje faire pour effacer le buffer apres en avoir lu l'information dont j'ai besoin.

    j'ai utilisé un timer (1s) pour la lecture du port com, exiterait il une facon de créer un evenement sur reception d'un byte ?

    merci de vos reponse.

    voici mon code:
    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
     
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     
            Dim receive_string As String = ""
     
            'attente du CR "13"
            Do Until receive_string = "13"
                receive_string = Com.ReadByte
            Loop
     
            'reception de la trame de 8 byte
            Label1.Text = Com.ReadByte
            Label2.Text = Com.ReadByte
            Label3.Text = Com.ReadByte
            Label4.Text = Com.ReadByte
            Label5.Text = Com.ReadByte
            Label6.Text = Com.ReadByte
            Label7.Text = Com.ReadByte
            Label8.Text = Com.ReadByte
     
            Label10.Text = "Reception OK"
            Label10.BackColor = Color.Lime
     
     
            Label9.Text = My.Computer.Clock.LocalTime.ToLongTimeString
     
        End Sub

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    il ne faut pas faire ca sur un timer
    il y a en effet un évènement qui signale l'arrivée d'octets

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    merci pour la reponse

    mais venant juste de commencer a programmer en vb, peux tu m'expliquer comment créer cet évènement stp? et comment effacer le buffer de lecture
    sans utiliser readexisting qui vide le buffer?

    merci beaucoup

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    la classe System.IO.Ports.SerialPort possède plusieurs évènements dont ErrorReceived et DataReceived

    donc soit tu rajoutes handles derrière une sub ou alors tu fais un addhandler (1ère solution mieux)


    pour le vidage de l'arrivée, vérifie que ce n'est pas automatique
    sinon c'est DiscardInBuffer


    quand tu as une instance de classe, il suffit de taper un . derrière pour que tout ce qui existe dessus apparaisse avec une petite aide (on appelle ca l'intellisense)
    il suffit de lire et on sait tout faire ...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    Merci pour l'aide j'ai vais essayer cela desuite.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    me revoila,
    j'ai essayer le hendels deriere ma procedure sub mais je crois que je ne metrise pas encore le syntax,

    voici mon code
    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
     
    Public Sub LecturePortCom(ByVal sender As System.Object, ByVal e As System.EventArgs, ) Handles Com.DataReceived
     
            Dim receive_string As String = ""
     
            'attente du CR "13"
            Do Until Com.ReadByte = "13"
            Loop
     
            'reception de la trame de 8 byte
            Label1.Text = Com.ReadByte
            Label2.Text = Com.ReadByte
            Label3.Text = Com.ReadByte
            Label4.Text = Com.ReadByte
            Label5.Text = Com.ReadByte
            Label6.Text = Com.ReadByte
            Label7.Text = Com.ReadByte
            Label8.Text = Com.ReadByte
     
        End Sub
    mais j'ai une erreur qui me dit que le handels attend une variable withevents

    et là comme je debute je pige pas.

    merci pour votre aide.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    dim a as machin
    dim withevents a as machin


    (dim ou private ou public)




    withevents permet d'utiliser handles

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    Sorry de ne repondre que maintenant,

    merci pour votre aide ca fonctionne,

    voici mon code pour ceux qui comme moi debute et à qui cela pourrais être utile.

    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
     
     
       Public WithEvents Com As System.IO.Ports.SerialPort
     
     
     
        Public Sub Lecture() Handles Com.DataReceived
     
            Control.CheckForIllegalCrossThreadCalls = False
     
            Com.ReadTimeout = 1000
     
            Try
                'attente du CR "13"
                Do Until Com.ReadByte = "254"
                Loop
     
                'reception de la trame de 8 byte
                Label1.Text = Com.ReadByte
                Label2.Text = Com.ReadByte
                Label3.Text = Com.ReadByte
                Label4.Text = Com.ReadByte
                Label5.Text = Com.ReadByte
                Label6.Text = Com.ReadByte
                Label7.Text = Com.ReadByte
                Label8.Text = Com.ReadByte
                Com.DiscardInBuffer()
     
                Label10.Text = "Reception OK"
                Label10.BackColor = Color.Lime
     
            Catch
                Label10.Text = "No Reception"
                Label10.BackColor = Color.Red
     
            End Try
     
            Label9.Text = My.Computer.Clock.LocalTime.ToLongTimeString
     
        End Sub
     
     
      Public Sub ErreurLecture() Handles Com.ErrorReceived
            Label10.Text = "No Reception"
        End Sub
    il est surement possible de faire mieux mais bon ca fonctionne quand même.

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

Discussions similaires

  1. [WD20] Ecriture et lecture port COM
    Par arnaud_verlaine dans le forum WinDev
    Réponses: 5
    Dernier message: 12/04/2015, 04h29
  2. lecture port COM sur event
    Par fantasiopop dans le forum Développement OS X
    Réponses: 0
    Dernier message: 09/10/2014, 09h15
  3. Lecture port COM problème
    Par seb-65 dans le forum WinDev
    Réponses: 13
    Dernier message: 19/09/2012, 02h18
  4. [débutant]Lecture port COM avec configue
    Par kyoleroi dans le forum C++
    Réponses: 0
    Dernier message: 22/04/2008, 12h02
  5. Lecture / écriture sur un port com
    Par dorian833 dans le forum C++
    Réponses: 7
    Dernier message: 07/07/2005, 15h20

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