raton_vicious
Messages postés7Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 3 octobre 2003
-
2 oct. 2003 à 12:20
FreeYo
Messages postés31Date d'inscriptionjeudi 31 juillet 2003StatutMembreDernière intervention 7 octobre 2004
-
5 oct. 2003 à 02:41
Bonjour,
Dans le cadre d'un projet que je suis en train de faire, je travaille avec les API Win pour manipuler une liaison série avec un equipement mais je ne sait pas quelle structure (DCB,COMSTAT ou autre) utiliser pour savoir si l'equipement est bien connécté
WormsTeam
Messages postés4Date d'inscriptionmercredi 1 octobre 2003StatutMembreDernière intervention 4 novembre 2003 2 oct. 2003 à 12:33
Hi,
La fonction suivante te donne le minimum minimorum pour te permettre d'ouvrir un port com en travaillant avec les api win. Pour savoir si ton équipemement est connecté, il ne s'agit plus que d'un problème de protocole.
sprintf(csPortName, "COM%d:", PortCom);
/* Ouverture du port de com*/
h = CreateFile(csPortName, GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
*hSerialPort=h;
if (hSerialPort == INVALID_HANDLE_VALUE)
{
return INVALIDE;
}
/* recupère la config actuelle du port. On est donc sur qu'elle est correcte.*/
if ((GetCommState(*hSerialPort, &MyDCB)) == FALSE)
{
Close(hSerialPort);
return CANT_GET_STATE;
}
/* Changement de la config du port*/
MyDCB.BaudRate = CBR_115200; //Test du nouveau débit.
//MyDCB.BaudRate = CBR_19200; // ligne d'origine.
// MyDCB.BaudRate = CBR_9600; // MRJ : Ligne de test fréquence basse
MyDCB.ByteSize = 8;
MyDCB.StopBits = ONESTOPBIT;
MyDCB.Parity = NOPARITY;
/* ReConfiguration du port de com avec les nouvelles valeurs.*/
if ((SetCommState(*hSerialPort, &MyDCB)) == FALSE)
{
Close(*hSerialPort);
return CANT_SET_STATE;
}
raton_vicious
Messages postés7Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 3 octobre 2003 2 oct. 2003 à 13:06
Merci bien mais j'ai deja toute la structure d'ouverture, d'envoi et de reception selon mon protocole.
Si tu ve j'ai fait un timer (WM_TIMER) qui toute les seconde demande a mon equipement si il a des evenements a m'envoyer (envoi trame pour connaitre nombre d'evt puis si nombre!= 0 reception des evenements) donc je lis et ecrit constamment sur la voie série mais comme je n'ai pa gérer la deconnexion du cable mon appli plante des que je debranche l'equipement du PC (a la lecture donc) et j'aimerai avoir des conseil pour savoir comment resoudre le probleme...
Merci ++
WormsTeam
Messages postés4Date d'inscriptionmercredi 1 octobre 2003StatutMembreDernière intervention 4 novembre 2003 2 oct. 2003 à 14:42
Je sais pas si ton problème vient de là mais configure le timeout de la lecture/ecriture sur ton port. Pour ceci, utilise la fonction SetCommTimeouts. Pour plus de détail sur son fonctionnement, voir doc (msdn par exemple). Si t'as pas de doc, reposte un message, je te la ferait suivre.
raton_vicious
Messages postés7Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 3 octobre 2003 2 oct. 2003 à 16:54
C bien la mon probleme, je ne compren pas bien comment marche la structure COMMTIMEOUT pour la lecture, don je rentre dans une boucle infini, pe etre devrais-je faire autrement??? voici ma boucle
WormsTeam
Messages postés4Date d'inscriptionmercredi 1 octobre 2003StatutMembreDernière intervention 4 novembre 2003 2 oct. 2003 à 17:34
oué moi je ferais plutot un truc du genre :
int erreur = NO_ERR;
while(erreur == NO_ERR)
{
int nBytes = 0;
if ((nBytes ReadFile(h_port,Buff,stat.cbInQue,&lect,NULL)) true)
{
//Traitement spécifique sur une lecture de bytes sur le port com
stat.cbInQue -= nBytes;
}
else//Cas d'erreur !!!!
{
....erreur = GetLastError();
//Traitement spécifique de l'erreur
}
}
Bref, ne détecte pas une erreur sur le port com avec le nombre d'octet lu mais plutot avec le code retour de la fonction ReadFile. Bon a priori, ta technique doit marcher, mais c'est mieux de tester le code retour de readfile.
Là, tu me dis que ta technique marche pas, donc vérifie bien ta config des time out. Peut-être qu'elle est trop breve ???
raton_vicious
Messages postés7Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 3 octobre 2003 2 oct. 2003 à 18:29
Merci pour l'idée, je vai essayer...
Mais comme tu di je dois avoir un pbl de timeout car quand je deconnecte l'equiepement ça plante, je vois sa demain
Merci bcp!!
FreeYo
Messages postés31Date d'inscriptionjeudi 31 juillet 2003StatutMembreDernière intervention 7 octobre 2004 2 oct. 2003 à 19:16
8-) FreeYo
La gestion d'une communication RS232 avec l'API Win32 est beaucoup plus compliquée et sensible qu'il n'y paraît !
Je pense que tes problèmes proviennent d'une mauvaise gestion des Lectures/Ecritures provoquant an 'unpredicted result' au niveu des tampon d'entrée et de sortie.
Le mode synchrone convient pour l'envoie d'un fichier, mais pour une communication full duplex, il est vivement recommander d'utiliser le mode asynchrone.
Il faut donc utiliser ReadFile et WriteFile avec des structures overlapped et créer des Thread de lecture et d'écriture.
Ensuite, il faut gérer tout ça avec des WaitForMultipleObjects répondant aux evènements des structures Overlapped.
Ne surtout pas utiliser WaitCommEvent qui déconne au niveau de la file d'attente du buffer d'entrée.
Mots Clés :
CreateFile et FILE_FLAG_OVERLAPPED
CreateEvent
CreateThread (AfxBeginThread en MFC)
ReadFile with Overlapped
GetLastError() et ERROR_IO_PENDING
WaitForMultipleObjects
GetOverlappedResult
ResetEvent
raton_vicious
Messages postés7Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 3 octobre 2003 3 oct. 2003 à 10:56
Free yo, j'ai trouvé ça sur la toile, di moi si c une bonne base...mais je sai pas si j'ai besoin de tout ce k'il a configuré dans DCB, et perso g 2 caractere de fin de chaine possible '>'(62) et ')'(41)
voila le lien:
http://e.cocquerez.free.fr/excode.html
FreeYo
Messages postés31Date d'inscriptionjeudi 31 juillet 2003StatutMembreDernière intervention 7 octobre 2004 5 oct. 2003 à 02:41
8-) FreeYo
C'est un bon point de départ au niveau du concept.
Mais les fonction de Lecture/Ecriture doivent être dans des Thread afin d'augmenter la robustesse.
De plus, il ne faut pas utiliser WaitCommEvent, qui perd des octets de la file d'attente d'entrée.
Pour la structure DCB, il n'est pas necessaire d'en connaitre tous les paramètres.
Utilise le code suivant :