Balance RS232

pitufo2804 - 19 sept. 2012 à 12:09
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 21 sept. 2012 à 16:52
Bonjour,
Apres quelques recherches sur google je ne trouve pas de solutions concrètes...
J'essaie de développer une "appli" permettant de récupérer des valeurs issue d'une balance connectée en RS232 au PC.
Ma balance est configurée de la sorte :
- 1200bauds
- 7 bits de données
- 1 bit de parité (paire)
- 1 bit de stop
J'ai ces quelques lignes de code afin de récupérer la valeur :
Private Sub CommandButton1_Click()

With MSComm1
    .InBufferCount = 0
    .CommPort = 1
    .Handshaking = comNone
    .Settings = "1200,o,7,1"
    .InputLen = 3
    .PortOpen = True
End With

Do While MSComm1.Input <> "   +"
Loop

MSComm1.InputLen = 5
    Label1.Caption = MSComm1.Input
    ActiveCell.Value = CSng(Label1.Caption)
    ActiveCell.Offset(1, 0).Select
    
MSComm1.PortOpen = False

End Sub


Mais j'ai une erreur à la ligne " Do While MSComm1.Input <> " +" "
qui me dit :
" Erreur d'éxécution '8020':
Error reading comm device."
J'ai quand même effectué des test avec l'hyper terminal et la com fonctionne sans soucis.
Enfin, sur la doc de la balance, la trame est comme ça :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... ... ...
B B B S D7 D6 D5 D4 D3 D2 D1 DP D0 B U ... CR LF

B -> Blanc -> Caractère blanc (espace)
S -> Sign -> Signe (+,-,espace)
DP -> Decimal Point -> Point décimal
D0...D7 -> Digits -> Chiffres
U -> Unit -> Unité
CR -> Carriage Return -> Retour Chariot
LF -> Line Feed -> Saut de Ligne

7 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
19 sept. 2012 à 13:22
Salut

Tu n'as pas lu assez attentivement l'aide de MSComm.

InputLen définit le nombre de caractères/bytes dans le buffer du port com qui provoque le déclenchement de l'évènement de réception.
C'est dans cet évènement de réception qu'il faut alors lire le contenu du buffer.
Voir l'exemple fournit dans l'aide.
Si tu tentes de lire le buffer alors qu'il n'y a rien dedans, cela provoque une erreur.

[code=vb]Do While MSComm1.Input <> " +"
Une chance sur 1 million que tu boucles un jour la dessus :
Tu définis un buffer de 3 ou 5 caratères et tu en attends 4.
D'autre part, attention : Une boucle sans DoEvents à l'intérieur peut causer une perte de contrôle du programme : tu ne pourrais pas l'arrêter.

Il faut :
- que tu lises le buffer au moment opportun
- que tu stockes les données reçues dans une variable qui conservera ses données entre deux lectures
- que tu analyses le contenu de cette variable (par exemple dans un Timer, toutes les secondes) pour tenter de repérer une trame complète que tu attends

Il y a des tas d'exemples parmi les sources du site.

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

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Bonjour,
merci pour la réponse mais je ne vois pas trop où tu veux en venir...
un exemple peut être ?
pour la doc de MSComm je l'ai bien lue...

 TOCARD D'UN JOUR, TOCARD TOUJOURS !!!
0
Voilà le code final et fonctionnel :
Private Sub CommandButton1_Click()

'Vider le buffer
MSComm1.InBufferCount = 0
'Numéro port série
MSComm1.CommPort = 1
'Vitesse, parité, nb bits
MSComm1.Settings = "1200,e,7,1"

'ouvre le port
MSComm1.PortOpen = True

'Lecture de la trame
Dim Reponse As Variant, Msg$
On Error Resume Next: Err.Clear
Do: If Err Then Exit Do
MSComm1.InputLen = 15
Msg$ = Msg$ & MSComm1.Input
Reponse = MsgBox("Appuyer sur le bouton PRINT de la balance et cliquer sur OK" & vbCrLf & Msg$, vbOKCancel, "Annuler pour quitter")
If Reponse <> vbOK Then Exit Do
Loop

'Traitement de la pesée
If (Msg$ <> "") Then
    'Affichage dans l'userform
    Label1.Caption = Msg$
    'Lecture à partir du 8ème bit
    Msg$ = Mid(Msg$, 8)
    'Lecture de 6 bits
    Msg$ = Left(Msg$, 6)
    'Ecriture du poids dans la cellule active
    ActiveCell.Value = Msg$
End If
   
'ferme le port
MSComm1.PortOpen = False

End Sub


Maintenant à améliorer pour faire une série de pesées qui s'affichent automatiquement dans les cellules....  TOCARD D'UN JOUR, TOCARD TOUJOURS !!!
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
21 sept. 2012 à 00:08
Non, tu n'as lu la doc complètement.
Il ne faut pas aller lire le buffer comme ça, sur un coup de tête.
Ce composant génère un évènement 'OnComm' lorsqu'il se passe quelque chose : Données dans le buffer, signaux CTS/DTS/... qui changent d'état, etc.
Il faut donc programmer la lecture dans cet évènement.
Dans l'aide, il y a un code explicatif.

Ce qu'il faut que tu comprennes aussi, c'est qu'un port comm buffurise les données que ton programme viendra lire.
Selon que ta machine est rapide ou pas, les données dans le buffer peuvent arriver incomplètes (si tu lis trop vite les données) ou les unes à la suite des autres (si tu tardes à les lire).
Un port comm est matériel : il faut donc laisser le temps au PC de gérer le transfert de ces infos en mémoire.

Donc, les données que tu lis, il ne faut pas les analyser telles quelles car il y a de fortes chances qu'elles soient incomplètes au début. Ajoute-les aux précédentes données dans une variable qui gardera son contenu entre 2 cycles de lecture.

Une fois que tu auras suffisamment de données pour pouvoir analyser une trame complète (test sur la longueur ou sur la recherche d'une balise de fin de trame), isole cette trame, analyse-la et, quand tu as terminé, tu la supprimes de ta variable.
Si la variable contient encore quelque chose, tu recommences le test longueur ou balise, jusqu'à épuisement des données.
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
21 sept. 2012 à 00:15
"... qui s'affichent automatiquement dans les cellules"
Ah mais tu es sous Excel ?
Tu aurais pu le dire et choisir la bonne catégorie. Voilà un temps précieux de perdu !
Tu fais du VBA, du VB6.

Lecture http://support.microsoft.com/kb/194922/fr

Pour info, les fichiers FRM ou BAS (ou CLS) des sources en VB6 que tu trouveras sur ce cite sont lisibles avec NotePad.
0
Avec ça, ça tourne :
Private Sub CommandButton1_Click()

MSComm1.InBufferCount = 0 'vide buffer
MSComm1.CommPort = 1 'No port série
MSComm1.Settings = "1200,e,7,1" 'vitesse, parité, nb bits
MSComm1.PortOpen = True 'ouvre le port

'Lecture de la trame
Dim Reponse As Variant, Msg$, Pds$
On Error Resume Next: Err.Clear
Do
 Reponse = MsgBox("Appuyer sur le bouton PRINT de la balance et cliquer sur OK" & vbCrLf & Msg$, vbOKCancel, "Annuler pour quitter")
 If Reponse <> vbOK Then Exit Do
 MSComm1.InputLen = 17
 Msg$ = MSComm1.Input: If Err Then Exit Do
T! = Timer: While Abs(Timer - T) < 0.2: DoEvents: Wend 'delay
 Pds$ = Mid(Msg$, 8, 6)
 ActiveCell.Value = Pds$ 'colle le poids dans la cellule active
 ActiveCell.Offset(1, 0).Activate 'cellule suivante
Loop

'Affichage dans l'userform et ferme le port
If Msg$ > "" Then Label1.Caption = Pds$
MSComm1.PortOpen = False
End Sub
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
21 sept. 2012 à 16:52
Du bricolage, pas de la programmation
Mais bon, si ça te va ...
0
Rejoignez-nous