Afficher la donnée reçue via un port Com

basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 8 mars 2008 - 31 mars 2007 à 02:09
42wawa42 Messages postés 143 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 6 septembre 2011 - 1 avril 2007 à 20:12
Bonjour,

je suis un débutant
en VB et je suis chargé de créer une application en VB qui permet
d'afficher le poids d'une balance liée à un PC à travers un port série.
 Par exemple si la balance affiche 20600Kg, mon application devrait affiché sur la zone de texte reservée à cette fin : 20600Kg.

Le programme qui récupère le poids est le suivant:
Private Sub MSComm1_OnComm()

Dim tampon as String

Select Case MSComm1.CommEvent

    'liste des erreurs possibles



            Case comEventBreak      ' On a reçu un signal d’interruption (Break)


            Case comEventCDTO       ' Timeout de la porteuse


            Case comEventCTSTO      ' Timeout du signal CTS (Clear To Send)


            Case comEventDSRTO      ' Timeout du signal de réception


            Case comEventFrame      ' Erreur de trame


            Case comEventOverrun    ' Des données ont été perdues


            Case comEventRxOver     ' Tampon de réception saturé


            Case comEventRxParity   ' Erreur de parité


            Case comEventTxFull     ' Tampon d’envoi saturé


            Case comEventDCB        ' Erreur de réception DCB (jamais vu)



            ' liste des événements possibles qui sont, eux, normaux



            Case comEvCD            ' Changement dans la broche CD (porteuse)


            Case comEvCTS           ' Changement dans broche CTS


            Case comEvDSR           ' Changement dans broche DSR (réception)


            Case comEvRing          ' Changement dans broche RING (sonnerie)


        
            Case comEvReceive       ' Si on reçoit des données


                tampon=MSComm1.Input


                Call Traitement(tampon) ' Routine de traitement



            Case comEvSend          ' Il y a des caractères à envoyer

        
            Case comEvEOF           ' On a reçu le caractère EOF



        End Select



        End Sub

' Cette procedure sert à traiter l’information reçue dans le tampon



        Sub Traitement(tampon As String)

' Ici, on affiche le résultat dans un champ de texte


        Text1.Text=Text1.text & tampon


        
        End Sub


Sur cette dernière partie de mon programme et sur la zone texte Text1 au lieu d'avoir 20600Kg, j'obtiens 20600KG 20600KG 20600KG 20600KG 20600KG et celà en permanenece car, je sais très bien que mon port com est toujours ouvert et que mon tampon reçoit tjrs MSComm1.Input
mais mon idée est d'écraser tampon sur la zone de textes Text1 par celle qui viendera par la suite et non pas les mettre l'une après l'autre.

Merci d'avance!

12 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 mars 2007 à 02:58
Salut
Tu dis recevoir ce texte "20600KG 20600KG 20600KG 20600KG 20600KG"
Il y a donc un séparateur entre chaque donnée : Cela ressemble à un espace (à voir)
Il te suffit donc d'isoler la derniere donnée lue et de vérifier qu'elle est complète (qu'elle se finit bien par KG)
Ceci t'affichera la dernière valeur reçue

Sub Traitement(tampon As String)
   Dim aData() As String
   Dim sDerniereData As String
   aData = Split(Tampon, " ")   ' Transforme le Tampon en tableau, séparateur "espace"
   sDerniereData = sData(UBound(sData))   ' Récupère le dernier élément
   If Right$(sDerniereData, 2) = "KG" then   ' Vérifie la pertinence de la dernière donnée
      Text1.Text = sDerniereData   ' Ok, on l'affiche
   Else
      ' Les 2 derniers caractères ne sont pas corrects (donnée tronquée)
      If UBound(sData) > 0 Then   ' S'il y a assez de données
         sDerniereData = sData(UBound(sData) - 1)   ' On prend la précédente
         Text1.Text = sDerniereData 
      Else
         ' Sinon, on ne touche pas à Text1
      End If
   End If
End Sub

Je n'aime pas trop donner du code tout fait (ce n'est pas forcement un cadeau à te faire si c'est pour un stage), mais bon ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Mikaels35 Messages postés 146 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 17 novembre 2009 2
31 mars 2007 à 07:33
Salut

Ici, on affiche le résultat dans un champ de texte

Text1.Text=Text1.text & tampon

Tu rajoutes le tampon chaque fois dans ta textbox !

Essaie Text1.Text=tampon simplement !

@+
0
42wawa42 Messages postés 143 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 6 septembre 2011
31 mars 2007 à 14:14
AFFICHER-DONNEE-RECUE-VIA-PORT-COM<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>







Avec ton programme Hypertermnal récupère quelque tram de la balance, enregistre les données dans un fichier. Ouvre ton ficher avec un programme Bin (valeur Hex) et tu verras le début ou la fin de ton protocole d’échange entre la BALANCE et ton PC de là tu peu construire ton programme.

A Plus sur VBFrance  
42wawa42




 
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 8 mars 2008
31 mars 2007 à 15:19
Avec ton programme Hypertermnal récupère quelque tram
de la balance, enregistre les données dans un fichier. Ouvre ton ficher
avec un programme Bin (valeur Hex) et tu verras le début ou la fin de
ton protocole d'échange entre la BALANCE et ton PC de là tu peu
construire ton programme.

A Plus sur VBFrance  
42wawa42

Evidement, je peux voir la trame qui est délivrée par ma balance mais le problème c'est que je suis pas connaisseur en pragrammation VB et je ne sais pas comment cérner mon information.

je te donne un exemple, la trame délivrée par ma balance est sous cette forme:
Nbre bytes: | 1    |                             7 Bytes      | 1    |
Hexa         : | 02  | 20 | 20 | 32 | 30 | 37 | 30 | 30 | 0D |
Ascci        : |STX|      |      |  2  |  0  |  6  |  0  |  0  | Cr  |
Explication: Début (Espace) 2    0     6    0       0  Fin (retour chariot)

Est ce que vous pouvez me dire comment exploiter cette donner pour ne rien afficher que 20600 et pour l'unité je vais mettre un label nommé Kg.

Meri
 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 mars 2007 à 18:44
Re
A mon avis, ce que je t'ai proposé fonctionne, tu n'as qu'à remplacer le séparateur de Split "espace" utilisé par défaut, par le STX = Chr$(2).
Comme, contrairement à ce que tu disais, chaque donnée ne se termine pas par KG (2 caractères) mais par un vbCr (1 caractère), il suffit de changer celà aussi : Remplacer dans le Righ$(.., 2) par (..., 1) et "KG" par vbCr

Je ne te donnerai pas le code corrigé.
Si tu analyses le code commenté que je t'ai fourni, tu dois pouvoir le faire seul, c'est assez simple.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
42wawa42 Messages postés 143 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 6 septembre 2011
31 mars 2007 à 21:16
Voila le protocole de t’as source (BALANCE)  le premier code est Hex(h02) puis le poids et le character Hex(h0d) . Il te reste une seule chose a savoir quel sont les valeurs Mini et Maxi de la balance et voir est si ton Protocole est correcte donc il faut tester le protocole. Il ce peut que ta Balance te donnes un message Erreur si le poids est supérieur au Maxi autorisé. Tous reste a voir.
 

          | 01  | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
Hexa : | 02  | 20 | 20 | 32 | 30 | 37 | 30 | 30 | 0D|
          |       |     |      | 2  |  0  |  7  |  0  |  0 |      |
Il faut trouver Byte 02 égale                            03 égale
Byte 04 a 08 = Poids
Byte 09 fin de message

Bonne chance.
 A Plus sur VBFrance 42wawa42<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 8 mars 2008
31 mars 2007 à 21:20
rebonjour,

en faite j'ai corrigé le code comme tu m'as dit Jack
Sub Traitement(tampon As String)
   Dim aData() As String
   Dim sDerniereData As String
   aData = Split(Tampon, " ")   ' Transforme le Tampon en tableau, séparateur "espace"
   sDerniereData = sData(UBound(sData))   ' Récupère le dernier élément
   If Right$(sDerniereData, 2) = "KG" then   ' Vérifie la pertinence de la dernière donnée
      Text1.Text = sDerniereData   ' Ok, on l'affiche
   Else
      ' Les 2 derniers caractères ne sont pas corrects (donnée tronquée)
      If UBound(sData) > 0 Then   ' S'il y a assez de données
         sDerniereData = sData(UBound(sData) - 1)   ' On prend la précédente
         Text1.Text = sDerniereData 
      Else
         ' Sinon, on ne touche pas à Text1
      End If
   End If
End Sub

mais mon compilateur me donne une  erreur au nivau de cette ligne:

sDerniereData = sData(UBound(sData))   ' Récupère le dernier élément

en fait t'as pas déclaré :

Dim sData() As String

Merci
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 avril 2007 à 01:40
Salut
Non, tu n'as rien corrigé, bref
Pour ton erreur, elle doit bien avoir un numéro et un descriptif ?
Confirme nous : Tu es bien sous VB6 (pas sous VBA) ?
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 8 mars 2008
1 avril 2007 à 02:37
oui sous VB6.
voici mon code sur lequel je travaille:

Private Sub MSComm1_OnComm()
Dim tampon As String

Select Case MSComm1.CommEvent
' On effectue la gestion des erreurs (cf. le modèle ci-dessus)
' Ici, on gère en fait pas grand-chose, mais c'est pour illustrer la démarche ;)

'liste des erreurs possibles
Case comEventBreak 'On a reçu un signal d’interruption (Break)
Case comEventCDTO ' Timeout de la porteuse
Case comEventCTSTO ' Timeout du signal CTS (Clear To Send)
Case comEventDSRTO ' Timeout du signal de réception
Case comEventFrame ' Erreur de trame
Case comEventOverrun ' Des données ont été perdues
Case comEventRxOver ' Tampon de réception saturé
Case comEventRxParity ' Erreur de parité
Case comEventTxFull ' Tampon d’envoi saturé
Case comEventDCB ' Erreur de réception DCB (jamais vu)

'liste des événements possibles qui sont, eux, normaux
Case comEvCD 'Changement dans la broche CD (porteuse)
Case comEvCTS 'Changement dans broche CTS
Case comEvDSR 'Changement dans broche DSR (réception)
Case comEvRing 'Changement dans broche RING (sonnerie)

'Chouette! on a reçu des données :)
Case comEvReceive
      tampon = MSComm1.Input
     
      Call Traitement(tampon) 'traitement données
    
Case comEvSend ' il y a des caractères à envoyer

Case comEvEOF 'on a reçu le caractère EOF
End Select
End Sub

Sub Traitement(chaine As String)

    Text1.SelStart = Len(Text1.Text)
    Text1.SelText = CStr(chaine) 'ici, on affiche le résultat dans un champ de texte
End Sub

la trame que je reçoit avec hyperterminal est comme suit:
   20440G�3;�2;

ce qui m'interesse moi est bien 20440, G indique l'état de la balance mais je n'en ai pas besoin
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 avril 2007 à 12:43
Salut

En me relisant moi même, j'ai en effet commis une erreur involontairement à propos de sData : Il faut, bien sûr, le remplacer par aData, c'est une faute de frappe.
Mais bon, c'était facile à deviner ...
0
basamir Messages postés 335 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 8 mars 2008
1 avril 2007 à 16:26
Merci pour ton aide mais ta solution ne marche pas, j'ai refait toute les modifs préconisées et ça n'affiche absolument rien.

Merci tout de même.

Je suis bloqué et je ne sais plus rien faire.
0
42wawa42 Messages postés 143 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 6 septembre 2011
1 avril 2007 à 20:12
‘ Programme simulateur pour la balance.



‘ Il faut mettre des chiffres dans la case texte et a utiliser la touche command



‘ le résulta de opération et de voir comment récupérer les valeur qui arrive



‘ sur le port com et éventuellement trouver toutes les autres valeurs de la balance.



‘ Visual Basic 6 n’accepte pas les caractères qui ne sont pas du tipe ASCII pour



‘ les mettrent dans un TextBox  ou autre ce sont les seules fois que j’ai eu des craches
‘ de programme.



‘ Ne t’encombre pas de la partie que tu as déjà programmé les point forts sont :



‘ La routine MSComm1 pour le RS232



‘ la sub MSComm1_OnComm()



‘ avec un beuffer qui va t’aider a trouver le début de la tram



‘ pour ce faire il faut  utiliser instruction 



‘ MyPos  =  InStr(1,Variable du Buffer,chr(2), vbBinaryCompare)



‘ et la tu auras le début de la trame + 8 caractères que tu dois mettre dans une



‘ variable comme au nom strText et appeler la fonction TraitementProtocol (strText)



‘ et le tour sera boucler




<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 






‘ Le Programme…..



' Il faut une        TextBox                       nom Text1



'       "   un         CommandButton          nom Command1



'       "   des       Label    2 x                   nom Label1 et Label2



‘Dans Project   Add Module                 nom Module1







‘Voila j’espère que ce programme pourra te donner un coup de main. 




 







 







 






Option Explicit




 






Dim sBalance As sBalance



Dim bBalance As bBalance



Private
Sub Command1_Click()





Dim strText As String





If L
en(Text1.Text) < 5 Or Len(Text1.Text) >= 6 Then






   

MsgBox "Cinq chiffres svp de 0 a 9 "




   

Exit Sub





End If






 






strText = Chr(2) & Chr(0) & Chr(0) & Text1.Text & Chr(13)





TraitementProtocol (strText)



Label1.Caption = Poids_de_la_Balance



Label2.Caption = Hexa_Valeur





End Sub





‘-------------------------------------------------------------------------------------------------





‘Module 1





‘-------------------------------------------------------------------------------------------------





Option Explicit



Dim sBalance As sBalance



Dim bBalance As bBalance




 






Public Poids_de_la_Balance As String



Public Hexa_Valeur  As String






 






Public Type bBalance    'Protocole Balance






    Byte1 As String     'Start byte = 02H






   

Byte2 As String      '??? a découvrir, éventuellement partie du protocole




    Byte3 As String      '??? a découvrir, éventuellement partie du protocole




    Byte4 As String      'Poids de 0 a 9 * 10 de tonne




    Byte5 As String      'Poids de 0 a 9 * 1 de tonne




    Byte6 As String      'Poids de 0 a 9 * 100 de Kilo




    Byte7 As String      'Poids de 0 a 9 * 10 de Kilo




   

Byte8 As String      'Poids de 0 a 9 * 1 de Kilo






    Byte9 As String      'End of message = 0CH





End Type






 






Public Type sBalance






 
   strBalance As String * 9





End Type






 






Public Function TraitementProtocol(BalancePro)






    If Mid(BalancePro, 1, 1) = Asc(2) Then






    MsgBox "exit Function"






    Exit Function






    End If






  


 ' Rangement de la trame reçu




   

With bBalance






    .Byte1 = Mid(BalancePro, 1, 1)






    .Byte2 = Mid(BalancePro, 2, 1)






    .Byte3 = Mid(BalancePro, 3, 1)






    .Byte4 = Mid(BalancePro, 4, 1)






    .Byte5 = Mid(BalancePro, 5, 1)






    .Byte6 = Mid(BalancePro, 6, 1)






    .Byte7 = Mid(BalancePro, 7, 1)






    .Byte8 = Mid(BalancePro, 8, 1)






    .Byte9 = Mid(BalancePro, 9, 1)






   

' Prendre valeur de la trame en code ASCII seulement et seulement B4 a B8




    Poids_de_la_Balance = .Byte4 & .Byte5 & .Byte6 & .Byte7 & .Byte8




   

' ou code Hexa






    End With






    Dim i As Integer






    Dim t As String






    Hexa_Valeur = ""






    For i = 1 To Len(BalancePro)






        t = Hex(Asc(Mid(BalancePro, i, 1)))






       

If Len(t) 1 Then t "0" + t




        Hexa_Valeur = Hexa_Valeur & t & " "




    Next i



End Function



‘-------------------------------------------------------------------------------------------------------



‘Fin du Module 1



‘-------------------------------------------------------------------------------------------------------
0
Rejoignez-nous