[VBA]Lecture port série RS232

Signaler
Messages postés
21
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
12 avril 2012
-
Messages postés
21
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
12 avril 2012
-
Bonjour,
J'ai fait un programme sur excel 2003/VBA pour communiquer entre mon ordinateur et une balance via un port série.
Lorsque je lance mon programme aucune erreur ne s'affiche, mais je n'arrive pas à récupérer les infos envoyées par la balance. En effet, je voudrais rentrer dans un textbox la valeur de la balance en appuyant sur un bouton de mon userform.

Voici le programme :

Private Sub CommandButton1_Click()

' Tampon devant contenir la chaîne d'entrée
Dim Buffer As String
Dim t As Long

' Utilise COM1
MSComm1.CommPort = 5 ' port usb à gauche de l'ordinateur.

' 9600 bauds, pas de parité, 8 bits de données et 1 bit d'arrêt.
MSComm1.Settings = "9600,N,8,1"
' Indique au contrôle qu'il doit lire la totalité
' du tampon si la propriété Input est utilisée.
MSComm1.InputLen = 0
' Ouvre le port.
MSComm1.PortOpen = True
' Envoie la commande "lecture" de la balance.
MSComm1.Output = "S" & vbCrLf
MSComm1.InputLen = 10

t = Timer + 4: Do Until Timer > t: DoEvents: Loop

TextBox1.Value = MSComm1.Input

Dim data As String
data = MSComm1.Input
TextBox1.Text = data
If MSComm1.PortOpen True Then MSComm1.PortOpen False

End Sub

Est ce que quelqu'un aurait une idée? Je pense avoir bien programmée la balance et avoir envoyée la bonne commande.

Je vous remercie,


julienexam

8 réponses

Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
tu n'as pas un event d'aquisition sur ton mscomm1 plutot que ton

t
= Timer + 4: Do Until Timer > t: DoEvents: Loop
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
Private Sub MSComm_OnComm ()
 Select Case MSComm1.CommEvent
 ' Handle each event or error by placing 
 ' code below each case statement

 ' Errors
 Case comEventBreak ' A Break was received.
 Case comEventFrame ' Framing Error
 Case comEventOverrun ' Data Lost.
 Case comEventRxOver ' Receive buffer overflow.
 Case comEventRxParity ' Parity Error.
 Case comEventTxFull ' Transmit buffer full.
 Case comEventDCB ' Unexpected error retrieving DCB]

 ' Events
 Case comEvCD ' Change in the CD line.
 Case comEvCTS ' Change in the CTS line.
 Case comEvDSR ' Change in the DSR line.
 Case comEvRing ' Change in the Ring Indicator.
 Case comEvReceive ' Received RThreshold # of 
 ' chars.
 Case comEvSend ' There are SThreshold number of 
 ' characters in the transmit
 ' buffer.
 Case comEvEof ' An EOF charater was found in 
 ' the input stream
 End Select
 End Sub


s sera deja mieu que ta tempo

tu pourra mieu gerer la trame envoyé par ta balance
Messages postés
21
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
12 avril 2012

J'ai trouvé mon erreur, cela venait de mon microepsilon (port série) que j'avais mal configuré.

Merci Genildf de ta réponse. Mais quand je mets ça à la place de la tempo, cela ne marche plus...

Néanmoins, les valeurs qui rentrent dans mon textbox, qui sont sensé être ceux de la balance, sont sous une forme incompréhensible ( par ex : ë»6öKŠú+ë ). Je n'arrive pas à convertir tout cela en nombres décimal. J'ai essayé avec les fonctions de conversion de types de données ( CSng ), mais je ne m'en sors pas.

Pourriez vous m'aider? Merci


julienexam
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
cela doit etre un trame il faudrai savoir la parite est la meme que sur ta balance
Messages postés
21
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
12 avril 2012

Oui la parité est la même. Et je viens de changer la parité ainsi que les autres réglages ( sur la balance et dans le programme ) en faisant toutes les possibilités du manuel de la balance. A chaque fois les caractères dans mon textbox changent, mais ils sont toujours incompréhensibles.

julienexam
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
tente plutot sa (en restant sur ta logique
trame = MSComm1.Input

            While Len(trame) < 10
                trame = MSComm1.input
            End While

TextBox1.Value=trame



bon je sait pas ce que cela donnera mais voit si cela change quelque chose
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
pour le code que j'ai mit plus haut c pas pour remplace :D

c'est l'evenment lié a ton mscomm1 tu doit l'avoir dans tes declaration

genre:

Private Sub CommandButton1_Click() 

' Tampon devant contenir la chaîne d'entrée 
Dim Buffer As String 
Dim t As Long 

' Utilise COM1 
MSComm1.CommPort = 5 ' port usb à gauche de l'ordinateur. 

' 9600 bauds, pas de parité, 8 bits de données et 1 bit d'arrêt. 
MSComm1.Settings = "9600,N,8,1" 
' Indique au contrôle qu'il doit lire la totalité 
' du tampon si la propriété Input est utilisée. 
MSComm1.InputLen = 0 
' Ouvre le port. 
MSComm1.PortOpen = True 
' Envoie la commande "lecture" de la balance. 
MSComm1.Output = "S" & vbCrLf
end sub


Et pout ton retour de port:

Private Sub MSComm1_OnComm ()'Ca tu doit l'avoir en declaration

 Select Case MSComm1.CommEvent
 ' Handle each event or error by placing 
 ' code below each case statement

 ' Errors
 Case comEventBreak ' A Break was received.
 Case comEventFrame ' Framing Error
 Case comEventOverrun ' Data Lost.
 Case comEventRxOver ' Receive buffer overflow.
 Case comEventRxParity ' Parity Error.
 Case comEventTxFull ' Transmit buffer full.
 Case comEventDCB ' Unexpected error retrieving DCB]

 ' Events
 Case comEvCD ' Change in the CD line.
 Case comEvCTS ' Change in the CTS line.
 Case comEvDSR ' Change in the DSR line.
 Case comEvRing ' Change in the Ring Indicator.
 Case comEvReceive 

'Ici tu met ton code pour gerer ta trame avec ton textbox

TextBox1.Value = MSComm1.Input 

Dim data As String 
data = MSComm1.Input 
TextBox1.Text = data 
If MSComm1.PortOpen True Then MSComm1.PortOpen False 



'ton code de reception

 Case comEvSend 
 Case comEvEof ' 
 End Select
 End Sub

Messages postés
21
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
12 avril 2012

Le problème venait tout simplement d'un port série défaillant. Je l'ai changé et cela fonctionne. Je te remercie Genildf de ton aide et de tes conseils.

Cordialement,


julienexam