basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008
-
31 mars 2007 à 02:09
42wawa42
Messages postés143Date d'inscriptiondimanche 28 septembre 2003StatutMembreDerniè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.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
42wawa42
Messages postés143Date d'inscriptiondimanche 28 septembre 2003StatutMembreDerniè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.
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
42wawa42
Messages postés143Date d'inscriptiondimanche 28 septembre 2003StatutMembreDerniè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.
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDerniè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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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) ?
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDerniè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:
20440G3;2;
ce qui m'interesse moi est bien 20440, G indique l'état de la balance mais je n'en ai pas besoin
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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 ...