dim. 24 novembre 2019, 19h12
GLS
France
atoutfox.public.association
Re: port RS232
Bonjour,
Il suffit d'utiliser un des active x de Microsoft accessible et à utiliser directement dans un form VFP. (MSCOMM)
- Ajout objet VFP OLE , sélectionner Microsoft communication control version 6.0)
- un fois présent dans le formulaire VFP, il s'affiche sous forme d'un téléphone jaune posé sur un modem avec des voyants rouges et verts)
Dans cet objet OLE, depuis les propriétés suivantes sont à indiquer:.
ole.DTRenable = .F. && pas d'utilisation du DTR lors de communications sauf si le périphérique oblige son utilisation
ole.Commport = N° du port com RS232c à utiliser
ole.RTreshold = 1 && dès qu'un caractère est entré l'évènement This.OnComm() est déclenché
ole.InputMode = 0 && texte
ole.STreshold = 1 && émission dès le premier caractère écrit dans le port comm
ole.Settings = 9600,n,8,1 && vitesse de transmission prévu pour cette liaison RS232c
Utiliser l'évènement ole.OnComm() pour traiter les caractères entrants
Utiliser la propriété ole.OUPUT = 'la chaine de caractère à envoyer vers le périphérique'
Utiliser la propriété ole.InBufferCount > 0 && si le buffer de réception à au moins un caractère de réceptionné
Utiliser la propriété ole.input pour forcer la lecture de caractère, si l'on ne souhaite pas utiliser l'évènement ole.Oncomm() pour traiter la réception de caractères
Utiliser la propriété ole.CommEvent = 2 && pour tester si des caractères sont en cours de réceptions par l'UART du RS232C
Dans l'évènement OnComm()
L'évènement OnComm() de l'OLE pouvant se déclencher pendant une écriture dans le port RS232c par une méthode du formulaire, il faut penser à bloquer l'utilisation du port série en écriture tant qu'il est en réception
PROCEDURE OnComm
* ICI indiquer que le port RS232c est utilisé en lecture par exemple THISFORM.lReception = .T. mettre une propriété du formulaire à .T.
* Utiliser ole.input pour lire le port
IF m.THIS.CommEvent = 2 && Réception effective
IF m.THIS.InBufferCount > 0 && au moins un caractère de lu
cMaChaine = m.THIS.INPUT
i = 0
* Exemple de traitement de la chaine réceptionné avec un aquittement sur une fin de transmission
DO WHILE LEN(m.cMaChaine) > 0 AND ASC(SUBSTR(m.cMaChaine, m.i, 1)) <> 0
DO CASE
CASE SUBSTR(m.cMaChaine, m.i, 1) = CHR(04) && traitement cas du caractère 04 reçu EOT fin de transmission
THIS.OUPUT = CHR(06) && émission d'un caractère ACK
ENDCASE
i = m.i + 1
DOEVENTS && libère les ressources machine pour d'autres applications
ENDDO
ENDIF
ENDIF
* ICI indiquer que le port est libre en émission THISFORM.lReception = .F.
ENDPROC
* Pour émettre il suffit d'utiliser ole.OUPUT = 'la chaine à écrire'
Cordialement
GLS
Permalink : http://www.atoutfox.org/nntp.asp?ID=0000019482