PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → [V10] et la gestion des ports RS232
[V10] et la gestion des ports RS232
Iniciado por philippe.pasquali, 10,mar. 2006 13:17 - 2 respuestas
Publicado el 10,marzo 2006 - 13:17
Depuis la V8 il y a la possibilité de faire :

sOuvre(1,1024,1024,sTimeoutDéfaut,True)
sFixeParametre(....)
sEvénement(1,sEveCTS+sEveDSR+sEveRLSD+sEveRing,"eveCOM")

Avec :
PROCEDURE eveCOM(pComPort, pEve)
Trace(pEve)

et si il y a un changement d'état d'un des signaux de contrôle de modem on prut savoir quelle est L'ENTREE QUI A CHANGE D'ETAT mais, sauf erreur de ma part,
ON NE PEUT CONNAITRE SON L'ETAT !

ES-QUE LA V10 INTEGRE CETTE FONCTION ???
Publicado el 10,marzo 2006 - 14:38
Bonjour,

Non la fonctionnalité n'est pas présente. Je l'ai à nouveau suggérée à PC
SOFT suite à votre message, et je vous conseille d'en faire de même !

Elian Lacroix.

"Philippe Pasquali" <philippe.pasquali@bopack.com> a écrit dans le message
de news: 44115e74$1@news.pcsoft.fr...

Depuis la V8 il y a la possibilité de faire :

sOuvre(1,1024,1024,sTimeoutDéfaut,True)
sFixeParametre(....)
sEvénement(1,sEveCTS+sEveDSR+sEveRLSD+sEveRing,"eveCOM")

Avec :
PROCEDURE eveCOM(pComPort, pEve)
Trace(pEve)

et si il y a un changement d'état d'un des signaux de contrôle de modem on
prut savoir quelle est L'ENTREE QUI A CHANGE D'ETAT mais, sauf erreur de
ma part,
ON NE PEUT CONNAITRE SON L'ETAT !

ES-QUE LA V10 INTEGRE CETTE FONCTION ???
Publicado el 13,marzo 2006 - 10:03
hé M.... je m'en doutais un peut...
Je vais donc être obliger de me re-coltiner mscomm32.ocx de µsoft(qui fait ca depuis des années...), alors que je pensais justifier ma mise à jour en V10 grâce à ce point, qui n'est pas un détail pour moi. Dans mon projet de GPAO je connecte, en autre, un bouton ON/OFF pour signaler au programme dans l'état ou se trouve ma machine. C'est vrais que je détourne le but de la RS232 mais ca fonctionne nickel depuis 3 ans sur une 30taines de pc. Dans le cadre de la réécriture de ce programme je voulais utiliser la V10 mais bon pas utile alors je vais rester en V8 sauf si un patch sur la V10 apporte cette fonctionnalité. J'ai un peut matter les API et il faut juste implémenter la fonction "GetCommModemStatus" qui renvoie dans un DWORD l'état du CTS/DSR/RING et RLSD.
J'ai essayer de passer par la en utilisant un thread mais le comportement est instable..

Voici le code du thread
-------------------------
PROCEDURE WaitCommEvent()
// Chargement de la dll
hinstDll = ChargeDLL(dllName)
IF hinstDll=0 THEN RETOUR

// Ouverture
hCom = API( dllName, "CreateFileA", &PortCom, ETBinaire(0x80000000,0x40000000), 0x0, Null, 3, 0x0, Null)
IF hCom=-1 THEN DéchargeDLL(hinstDll); RETOUR

// Positionne le masque des événements possibles
IF NOT API(dllName, "SetCommMask", hCom, 0x138) THEN API(dllName, "CloseHandle", hCom); DéchargeDLL(hinstDll); RETOUR

// Boucle
WHILE Codeur
// Attente blocante d'un événement sur port com
IF API(dllName, "WaitCommEvent", hCom, &dwEvtMask, Null)>0 THEN
// Prend l'état des signaux de contrôle de modem
API(dllName,"GetCommModemStatus", hCom, &dwModemStatus)
// Extraction de l'état signal par signal
IF ETBinaire(dwModemStatus,0x0010)=0x0010 THEN CTS="ON" ELSE CTS="OFF"
IF ETBinaire(dwModemStatus,0x0020)=0x0020 THEN DSR="ON" ELSE DSR="OFF"
IF ETBinaire(dwModemStatus,0x0040)=0x0040 THEN RI="ON" ELSE RI="OFF"
IF ETBinaire(dwModemStatus,0x0080)=0x0080 THEN RLSD="ON" ELSE RLSD="OFF"
// Affichage
Trace("CTS (05)= " + CTS); Comptage++
Trace("DSR (06)= " + DSR)
Trace("RLSD (08)= " + RLSD)
Trace("RI (22)= " + RI)
Trace("-----------------------------------------")
Trace("Comptage="+Comptage)
Trace(Codeur=True)
Trace("-----------------------------------------")
END
END

et en déclaration de la collection de procedure j'ai
_OVERLAPPED est une structure
Internal est un entier sans signe
InternalHigh est un entier sans signe
Offset est un entier
OffsetHigh est un entier
hEvent est un entier
END

_COMSTAT est une structure
State est un entier sans signe sur 4 octets
cbInQue est un entier
cbOutQue est un entier
END
// State fait 32 bits composés de droite à gauche de
// 1 bit fCtsHold
// 1 bit fDsrHold
// 1 bit fRlsdHold
// 1 bit fXoffHold
// 1 bit fXoffSent
// 1 bit fEof
// 1 bit fTxim
//25 bits fReserved :25;

_DCB est une structure
DCBlength est un entier
BaudRate est un entier
Config est un entier
wReserved est un entier sur 2 octets
XonLim est un entier sur 2 octets
XoffLim est un entier sur 2 octets
ByteSize est un entier sans signe sur 1 octet
Parity est un entier sans signe sur 1 octet
StopBits est un entier sans signe sur 1 octet
XonChar est un entier sans signe sur 1 octet
XoffChar est un entier sans signe sur 1 octet
ErrorChar est un entier sans signe sur 1 octet
EofChar est un entier sans signe sur 1 octet
EvtChar est un entier sans signe sur 1 octet
wReserved1 est un entier sur 2 octets
END
// Config fait 32 bits composés de droite à gauche de
// 1 bit fBinary True/ False si le mode binaire est actif ou pas
// 1 bit fParity True/false si le contrôle de parité est actif
// 1 bit fOutxCtsFlow True/False CTS est utilisé pour le contrôle de flux input du PC
// 1 bit fOutxDsrFlow True/False DSR est utilisé pour le contrôle de flux input du PC
// 2 bits fDtrControl DTR : 00=Toujours inactif, 01=Toujours actif, 10=Est utilisé pour le contrôle de flux sortie du PC
// 1 bit fDsrSensitivity True/False : True on ignore les data tant que DSR est haut
// 1 bit fTXContinueOnXoff
// 1 bit fOutX
// 1 bit fInX
// 1 bit fErrorChar
// 1 bit fNull
// 2 bits fRtsControl RTS : 00=Toujours inactif, 01=ToujoursActif, 10 et 11 Est utilisé pour le contrôle de flux sortie du PC
// 1 bit fAbortOnError
//17 bits fDummy2

CONSTANT
dllName = "kernel32.dll"
END
GLOBAL
hinstDll est un entier = 0
PortCom est une chaîne ASCIIZ sur 16 = "COM1"
hCom est un entier = 0
o est un _OVERLAPPED
dwEvtMask est un entier sans signe = 0
Dummy1 est un entier = 0
Dummy2 est une _COMSTAT
DCB est une _DCB
dwModemStatus est un entier sans signe sur 4 octets
ErrorCode est un entier
CTS, DSR, RI, RLSD sont des chaînes


// Fermeture
API(dllName, "CloseHandle", hCom)
DéchargeDLL(hinstDll)

Le port étant ouvert en mode NON_OVERLAPPED fait que la fonction
"WaitCommEvent" attend un changement. Donc si je dois mettre fin au thread, je met Codeur=False, puis il faut débloquer la fonction avec un changement de niveau, si ce dernier arrive trois jours aprés !!! C'est vraiment galére...