Traitement données RS232

Picou

XLDnaute Nouveau
Bonjour à tous,

J'ai une interface de saisie de données codées sur VBA, je doit y inclure des données provenant d'un indicateur qui transmet un signal standard par RS 232, je n'ai pas encore put regarder comment arrive ce signal mais j'ai aucune idée de comment procéder pour l'intégrer à mon interface. Si vous avez des conseils ou idées, je suis preneur.
Merci
 
G

Guest

Guest
Re : Traitement données RS232

bonjour Picou,

Voici un code sensé (je ne l'ai pas testé) exploiter un port RS232.

Code:
'utiliser le port de communication RS 232
'commentaires anglo/néerlandais
' code de Rody Meulman, posté sur mpep
' (non testé, fs)
'nécessite le composant ActiveX "mscomm32.ocx" correctement enregistré
Dim MSComm1 As Object
Dim bInitComGlobals As Boolean
Sub InitComGlobals()
    If Not bInitComGlobals Then
        On Error Resume Next
        Set MSComm1 = CreateObject("MSCOMMLib.MSComm")
        If Err.Number <> 0 Then
            MsgBox Err.Description & vbLf & "Bitte installieren Sie" & "MSCOMM32.OCX!", _
            vbMsgBoxHelpButton, "Fehler beim Aufruf von MSComm", Err.HelpFile, Err.HelpContext
            End
        Else
            bInitComGlobals = True
        End If
        On Error GoTo 0
    End If
End Sub
Function CommPortOpen(nPort As Integer, nBaudRate As Long) As Boolean
    InitComGlobals
    MSComm1.CommPort = nPort
    On Error Resume Next
    MSComm1.PortOpen = True
    If Err = 0 Then
        CommPortOpen = True
        MSComm1.Settings = nBaudRate & ",N,8,1"
    Else
        CommPortOpen = False
        Err = 0
    End If
    On Error GoTo 0
End Function
Sub CommPortClose()
    If bInitComGlobals Then
    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False
        Set MSComm1 = Nothing
        bInitComGlobals = False
    End If
    End If
End Sub
'\----------------------------------------------------------------------------
'\ SerialWrite sends a string to the current comm port
'\ Return 0, wenn OK
'\      Fehler-Nummer bei Fehler
Function SerialWrite(T$) As Integer
    '\On Error Resume Next
    MSComm1.Output = T
    SerialWrite = Err
End Function
'\----------------------------------------------------------------------------
'\ SerialWait waits for a number of seconds (Wait) for a user-indicated string
'\ of characters (waitstr$) OR WaitStr2. It then stuffs the comm buffer into buf$ and returns
'\ TRUE if it finds the string, or FALSE otherwise.
Function SerialWait(buf$, Wait As Double, waitstr$, Optional WaitStr2) As Boolean
    Dim B$, Start, bStatusbar, bFound As Boolean, bStr2 As Boolean
    Start = Timer   '\ Set start time.
    bStr2 = Not IsMissing(WaitStr2)
    If bStr2 Then bStr2 = Application.IsText(WaitStr2)
    buf$ = ""
    bStatusbar = Application.StatusBar
    If bStatusbar = False Then Application.StatusBar = "Lese von ..."
   ' Wait for data to come back to the serial port.
    MSComm1.InputLen = 1 '\ nur immer 1 Byte lesen
    Do: DoEvents
        buf$ = buf$ & MSComm1.Input
        bFound = InStr(buf$, waitstr$) > 0
        If bStr2 Then bFound = bFound Or (InStr(buf$, WaitStr2) > 0)
    Loop Until bFound Or (Timer - Start > Wait)
    SerialWait = bFound
    If bStatusbar = False Then Application.StatusBar = False
End Function
'\----------------------------------------------------------------------------
'\ SerialCheck waits for the number of bytes in the comm-buffer
'\ max. 2 sec
'\ BUT read NOT
'\ return: True or False (bei Timeout )
Function serialCheck(nBytes) As Boolean
Dim bTimeout As Boolean, Start
    Start = Timer
    Do: DoEvents: bTimeout = Timer - Start > 2
    Loop Until MSComm1.InBufferCount >= nBytes Or bTimeout
    If bTimeout Then serialCheck = False Else serialCheck = True
End Function
'\----------------------------------------------------------------------------
'\ SerialRead waits for the number of bytes in the comm-buffer
'\ and read then
Function SerialRead(nBytes, buf$) As Integer
    Dim B$, nRead%, bStatusbar
    bStatusbar = Application.StatusBar
    If bStatusbar = False Then Application.StatusBar = "Lese von ..."
    SerialRead = 0
    MSComm1.InputLen = nBytes '\ nur nBytes  lesen
    serialCheck (nBytes) '\ Warten bis nBytes imm Puffer (bei Timeout ebenfalls lesen)
    buf$ = MSComm1.Input
    SerialRead = Len(buf$)
    If bStatusbar = False Then Application.StatusBar = False
End Function

Fais une recherche sur le forum, tu auras plein d'exemples.

A+
 
Dernière modification par un modérateur:

MJ13

XLDnaute Barbatruc
Re : Traitement données RS232

Bonjour Picou, Hasco


Picou, tu peux déjà faire une recherche sur XLD avec RS232.

Sinon, il est important de connaître la vitesse, la parité etc.. (voir avec le manuel de ton interface).


Voir sur le code d'Hasco ces paramètres

Code:
MSComm1.Settings = nBaudRate & ",N,8,1"
 

Picou

XLDnaute Nouveau
Re : Traitement données RS232

Bonjour,
après avoir suivi plus ou moins la solution du liens "communiquer avec les ports série", les données ajoutées dans ma valeur du poids net sont aléatoires. J'ai une transmission des données en continu de l'indicateur au pc donc suivant le moment ou est interrogé le port, les données sont différentes. J'ai essayé de régler la balance pour qu'elle n'envoi un signal que quand il y a une pesée stabilisé mais je n'arrive pas à faire apparaître ce signal.
Le code est au début de l'userform bobine.
Il intervient pour la création d'une bobine après remplissage des divers champ lors de "importer poids"
Merci de votre aide
 

Pièces jointes

  • Gestion traçabilité3.zip
    45.5 KB · Affichages: 200

Picou

XLDnaute Nouveau
Re : Traitement données RS232

Risleure, le forum,

j'ai bien le fichier .ocx qu'il parle mais après avoir modifié les paramètres concernant ma balance (9600,n,8,1) la boucle tourne indéfiniment, j'en ai déduit que ma balance n'emet pas de signe + pour une pesée. J'ai télécharger le programma Com TI et le signal en ASCII apparaît comme ceci :
@A@@@@@@54<CR>
Pour une pesée de 54kg sachant qu'à zéro il met I à la place de A. J'ai donc changé le + par le A mais rien n'y fait, ma boucle tourne dans le vide.
Le code :
MSComm1.InBufferCount = 0
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputLen = 1
MSComm1.PortOpen = True
MSComm1.InputLen = 5
ScreenUpdating = False
Do While MSComm1.Input <> "A"
Loop
Label1.Caption = MSComm1.Input
ActiveCell.Value = CSng(Label1.Caption)
ActiveCell.Offset(1, 0).Select
MSComm1.PortOpen = False
End Sub

Mais maintenant il me met une erreure d'exécution (13) incompatibilité de type sur la ligne ActiveCell.Value = CSng(Label1.Caption).

Merci de votre aide
 

Picou

XLDnaute Nouveau
Re : Traitement données RS232

Bonjour tout le monde,

Je crois que j'arrive au bout. Quand j'effectue mon code pas à pas, en mettant la souris sur MSComm1.input il apparaît le code envoyé par la balance, jusque la c'est normal mais dans ma ligne label3.caption=MSComm1.input quand je me met sur label3.caption il met " " alors qu'en face j'ai "@@@@54@". Je pense qu'il y a un soucis avec le langage ascii. Qu'en pensez vous?
 

Picou

XLDnaute Nouveau
Re : Traitement données RS232

Re le forum, Quelques détails, le code :
'Vider le buffer
MSComm1.InBufferCount = 0
'choisir un port série
MSComm1.CommPort = 1 'Ici
'Balance
'1200 bauds, parité, 7 bits de données, 1 bit d'arrêt
MSComm1.Settings = "1200,o,7,2" 'Ici
' indique au contrôle qu'il doit lire 1 seul caractère
'ce caractère sert à repérer la stabilisation de la balance
MSComm1.InputLen = 1 'Ici
'ouvre le port
MSComm1.PortOpen = True
'affiche un message
UserForm1.Label2.Visible = True
UserForm1.Repaint
'Boucle tant que le 1er caractère n'est pas un signe plus (+)
Do While MSComm1.Input <> "A" 'Ici
Label1.Caption = "Rien reçu !"
UserForm1.Repaint
Loop
UserForm1.Label2.Visible = False
UserForm1.Repaint
'lecture sur le port des 5 1ers caractères et stockage dans la boite de dialogue et dans la feuille active
MSComm1.InputLen = 11
Do While ActiveCell.Value = ""
Loop
Label3.Caption = MSComm1.Input
ActiveCell.Value = Label3.Caption
ActiveCell.Offset(1, 0).Select

'ferme le port
MSComm1.PortOpen = False 'Ici
End Sub

Alors j'exécute la macro en la faisant s'arrêter sur la dernière ligne, le label3 est toujours égal à " " donc je remonte "la ligne jaune" au niveau de label3.caption=MSComm1.input et je refait exécuter ces lignes et là ça marche alors je comprend pas.
Merci de votre aide
 

MJ13

XLDnaute Barbatruc
Re : Traitement données RS232

Bonjour Picou

Dans ton cas , il faudrait déjà partir sur une extraction simple en
mettant ta valeur sur une feuille par exemple.
ex:

Code:
cells(1,1).value = MSComm1.input

Ensuite ce sera plus simple pour comprendre ce qui se passe.
 

Picou

XLDnaute Nouveau
Re : Traitement données RS232

MJ13, le forum
J'ai testé avec ta solution MJ13 mais c'est toujours le même problème, l'application copie que des espaces dans la cellule désignée alors que quand je me met sur MSComm1.input j'ai la valeur que je veut qui apparaît. Toujours pareil, quand je fais la macro pas à pas ça marche mais quand elle fonctionne seule j'ai que des espaces qui apparaissent.
 

MJ13

XLDnaute Barbatruc
Re : Traitement données RS232

re

Ici
Code:
cells(1,1).value = MSComm1.lineinput

Si les majuscules s'affichent sur lineinput c'est que cela doit être correct.

Bon en fait cela ne fonctionne pas. Picou merci pour ton code.
 
Dernière édition:

Statistiques des forums

Discussions
312 232
Messages
2 086 461
Membres
103 220
dernier inscrit
samira2024