Communication avec un port COM - C++ - Programmation
Marsh Posté le 06-04-2004 à 09:17:51
une simple application ne peut accéder directement au matériel sous Windows NT/2000/XP, tu dois faire un driver (accessoirement, une petite recherche sur le forum te montrera que le sujet a déjà été traité maintes fois)
Marsh Posté le 06-04-2004 à 09:26:19
sisi justememt, des fonctions comme outp valides sous 98 par exemple ne fonctionnent plus sous NT, c'est pour cela qu'on doit utiliser un CreateFile.
j'ai vu cette utilisation apres bcp de recherches, a commencer par microsoft...
de plus des gens dans la boite ont deja procede de cette facon
donc je sais pas...
Marsh Posté le 06-04-2004 à 10:55:48
Tu as fais un GetLastError() pour cibler le problème ?
Marsh Posté le 06-04-2004 à 12:06:48
oui ca donnait l'erreur 5 "access denied"
mais en desinstallant le port COM et en redemarrant les pb ont disparu... mnt ca va
le nouveau pb c'est que le ReadFile ecrit pas dans mon buffer...
ahlala la prog windows...
Marsh Posté le 07-04-2004 à 10:37:24
*up*
j'ai un nouveau probleme au niveau du ReadFile cette fois
en fait le truc c'est que quand je fais une ReadFile il faut que des donnees aient ete envoyees avant (avec un WriteFile), sinon le programme plante carrement, sans aucun message d'erreur
un peu comme qd on essaye de lire dans un fichier : qd on arrive a la fin, ca plante si on gere pas le cas d'erreur
sauf que la, j'arrive pas a le gerer le cas d'erreur...
je poursuis mes recherches, mais ca m'arrangerait bien si quelqu'un avait une solution miracle
Marsh Posté le 07-04-2004 à 13:27:11
Une piste peut être le fait que tu as positionné le flag overlapped...donc tes opérations de lecture/ecriture sont asynchrones. Ainsi, ReadFile() te rend la main alors que la lecture n'est pas terminée...
Pour remédier à cela:
Récupérer la valeur de retour de ReadFile(), la traduire avec GetLastError() (attention une valeur de retour non-nulle ne veut pas dire qu'il y a succès, tu dois tester le nombre d'octets effectivement lus):
- Retour = ERROR_IO_PENDING: l'opération est en cours...
Dans ce cas, le mieux est d'attendre que l'opération se termine, une manière propre consisterait à te servir du Event que tu as passé en paramètre (dans la strucutre overlapped) au ReadFile():
Ex: WaitForSingleObject()...quand cette fonction te rend la main, c'est que:
- les données sont arrivées avant le timeout que tu as défini,
- le timeout a expiré...
- Retour = ERROR_HANDLE_EOF: pas de données lues (pb) -> a gérer...
A toi de faire le reste !
Marsh Posté le 07-04-2004 à 16:56:03
ok merci bien ca m'a un peu inspire et je me suis debrouille
j'avais aussi un probleme de pointeur, qui faisait lire des trucs qu'il fallait pas
maintenant ca va y'a plus de problemes
merci et puis peut etre a bientot pour de nouveaux soucis
Marsh Posté le 13-04-2004 à 12:09:50
me revoila !!!
bon cette fois j'ai un soucis un peu plus grave
en fait, les donnes sont transmises octet par octet sur le port COM, mais apparement, le bit de poids fort ne passe pas. Du coup, c'est comme si il valait toujours 0, ce qui est embettant pour les valeurs negatives par exemple.
voila, je cherche des experts en transmission de donnees sur le port serie (c'est ptet pu le bon forum du coup...) parce que la je comprends vraiment pas ce aui se passe
Marsh Posté le 13-04-2004 à 12:30:04
oui oui... 8 bit et aucune parite...
Marsh Posté le 13-04-2004 à 12:37:55
Peux-tu poster ton bout de code qui fait l'init et qui formate / envoit les datas ?
Marsh Posté le 13-04-2004 à 12:46:33
Même si c'est pas propre, ceci fonctionne très bien:
Code :
|
Marsh Posté le 13-04-2004 à 12:51:04
la fonction qui ouvre le port COM :
Code :
|
L'envoi des donnees
Code :
|
La creation du buffer :
en fait, j'ai une structure qui contient un tableau de 22 entiers 16bits
je les decoupe en 2 entiers 8bits chacun que je stock dans le buffer
Code :
|
voila, je sais pas si c'est exactement ca que tu voulais...
Marsh Posté le 13-04-2004 à 15:20:01
Code :
|
Marsh Posté le 13-04-2004 à 16:40:08
ca maaaaarche YOUPIIII !!!
Marsh Posté le 13-04-2004 à 18:27:17
j'ai bidouillé un peu partout : des signed char* (ou unsigned je sais plus) partout pour mes buffers d'ecriture et de lecture, des valeurs dans la DCB, et puis j'ai utilisé des constantes predefinies (NOPARITY, ONESTOPBIT)...
mais en fait je suis pas sûr parce qu'avec tous les changements que j'ai fait et refait ben moi-meme je suis un peu perdu
je crois que j'ai ete plus rigoureux sur les initialisations et toute la programmation au niveau du port, à part ca je sais pas trop...
donc ouais, c'est pas une super demarche de programmeur, mais tant pis, l'important pour l'instant c'est que ca marche...
si jamais ca replante ben... ca replantera pas !!
Marsh Posté le 06-04-2004 à 09:00:42
Salut a tous !
Je suis actuellement en train de developper une application pour dialoguer avec un port COM sous Windows2000 avec C++Builder
Mon probleme est que lors de l'ouverture de ce port avec la fonction CreateFile(...), j'ai une erreur comme quoi l'acces au port est refuse.
j'ai mon HANDLE definit comme ca :
hPort = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
et je test immediatement apres de la facon suivante :
if (hPort == INVALID_HANDLE_VALUE)
ce test vaut vrai a chaque fois
si qqn pouvait m'eclairer...
merci d'avance
a+
---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...