|
[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... |
| |
| |
| | | |
|
| | | | |
| | |
|