Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1622 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [Self-Résolu] Port Série (COM) et WriteFile()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Self-Résolu] Port Série (COM) et WriteFile()

n°1941717
VinceA
Posté le 17-11-2009 à 20:19:30  profilanswer
 

Bonsoir à tous :).
 
Je sais que ce post trouvait aussi sa place dans API WIN32, mais d'après les messages que j'y ai vu, on y parle plus de GUI que de bon vieux C procédural, donc j'ai préféré cette section ^^.
 
Alors je vous expose mon problème :
 
Je cherche à communiquer (écriture/lecture) via mon port série (COM1), jusque là rien d'anormal, je crée ma structure DCB, la modifie, etc.
L'identification de mon port via un HANDLE ne pose apparemment pas de problème, elle non plus.
 
Le soucis se trouve au niveau de WriteFile(), lorsque je désire écrire un caractère, la fonction échoue et l'erreur retournée est 82 (INVALID PARAMETER, d'après la doc de microsoft...)
 
Voilà le code :
http://vince.dc.free.fr/portCOM.html
 
Pour ceux qui n'aiment pas la colo' Notepad++ et préfèrent celle du forum :

Code :
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <stdlib.h>
  4. // CreateFile()
  5. #define dwDesiredAccess GENERIC_READ | GENERIC_WRITE
  6. #define dwShareMode 0
  7. #define CreateDisposition OPEN_EXISTING
  8. #define Flag FILE_FLAG_OVERLAPPED
  9. // PurgeComm()
  10. #define dwFlags PURGE_RXCLEAR | PURGE_TXCLEAR
  11. HANDLE WINAPI Init(char*); // Retourne le HANDLE de COM1
  12. void Ecrire_COM(HANDLE, char); // passe ces deux arg à WriteFile()
  13. char Lire_COM(HANDLE);
  14. int main(int argc, char *argv[]) {
  15.     HANDLE hCom = Init("COM1" ); // hCOM = HANDLE COM1
  16.     int Success;
  17.     char car = 'a';
  18.     unsigned long written;
  19.     /* PROGRAMME DE TEST */
  20.         Ecrire_COM(hCom, 'a');
  21.     /* FIN */
  22.     /* FERMETURE DU HANDLE, FIN DU PROGRAMME */
  23.     Success = CloseHandle(hCom);
  24.     if(!Success) {
  25.         printf("Impossible de fermer le HANDLE" );
  26.         return -1;
  27.     }
  28.     printf("HANDLE fermé. Fin du programme." );
  29.     return 0;
  30. }
  31. HANDLE WINAPI Init(char* COM) { // FONCTION D'INITIALISATION
  32.     DCB dcb;
  33.     HANDLE hCom;
  34.     int Success;
  35.     hCom = CreateFile(COM, dwDesiredAccess, dwShareMode, NULL, CreateDisposition, Flag, NULL);
  36.     // RECUPERE HANDLE SUR PORT COM
  37.     if( hCom == INVALID_HANDLE_VALUE) { // HANDLE invalide ?
  38.         printf("Erreur lors de la création du HANDLE hCom.\n" );
  39.         printf("Le port ne peut pas être ouvert ?\n" );
  40.         return hCom;
  41.     }
  42.     else { // HANDLE valide
  43.         Success = GetCommState(hCom, &dcb); // Copie de DCB
  44.         if(!Success)  // Copie de DCB ratée
  45.             printf("Copie de DCB raté.\n" );
  46.         else { // MODIFICATION DE DCB
  47.             dcb.fParity = NOPARITY; // 0 parité
  48.             dcb.BaudRate = 1200; // 1200b/s
  49.             dcb.ByteSize = 8; // Mot d'un octet (8 bits)
  50.             dcb.StopBits = ONESTOPBIT; // 1 bit de stop
  51.             Success = SetCommState(hCom, &dcb); // Reinit COM
  52.             if(!Success) // COM1 n'utilise pas notre DCB
  53.                 printf("Impossible de réinitialiser le port série." );
  54.             else { // COM1 UTILISE NOTRE DCB
  55.                 Success = PurgeComm(hCom, dwFlags);
  56.                 if(!Success) // Impossible de vider les buffers
  57.                     printf("Purge des buffers échouée." );
  58.                 else { // buffers vidés
  59.                     printf("Port série prêt, avec les paramètres désirés.\n" );
  60.                     return hCom;
  61.                 }
  62.             }
  63.         }
  64.     }
  65. }
  66. void Ecrire_COM(HANDLE hCom, char caractere) {
  67.     int Success;
  68.     DWORD written; // nombre de caractère écrit [inutile mais nécessaire...]
  69.     Success = WriteFile(hCom, &caractere, 1, &written, NULL);
  70.     if(Success == 0) { // Echec de WriteFile()
  71.         printf("Ecriture échouée.\n\n" );
  72.         written = GetLastError();
  73.         printf("Erreur n° %d\n\n", written);
  74.     }
  75.     else
  76.         printf("Ecriture réussie." );
  77. }


 
Si quelqu'un pouvait m'éclairer ou me donner une piste, je lui en serais vraiment reconnaissant, parce que là je suis complètement bloqué ^^'.
 
Merci d'avance.
Cordialement,
Vincent.


Message édité par VinceA le 18-11-2009 à 13:09:35
mood
Publicité
Posté le 17-11-2009 à 20:19:30  profilanswer
 

n°1941828
VinceA
Posté le 18-11-2009 à 10:51:34  profilanswer
 

En fait j'ai trouvé mon erreur, c'était à cause du FILE_FLAG_OVERLAPPED passé à CreateFile() ~...

 

donc voici le code "niquel" si ça intéresse quelqu'un :
http://vince.dc.free.fr/portCOM.html

 

(j'y ai ajouté la fonction de Lecture)


Message édité par VinceA le 18-11-2009 à 13:08:59
n°2138076
lilight
Posté le 21-04-2012 à 14:50:52  profilanswer
 

Bonjour,
Ton lien ne fonctionne plus, est il encore possible de récupérer ton code ?
Merci.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [Self-Résolu] Port Série (COM) et WriteFile()

 

Sujets relatifs
(résolu) Positionnement de footer[résolu][PHP/XML] lecture de fichier XML en PHP
boost::asio : trouver un port libre ?[RESOLU] [AS2] Chemin
[C] [resolu] lecture matrice alloué dynamiquementExecution javascript et condition unique [resolu]
[Ruby] exécution d'une commande 'echo' avec ruby [résolu][RESOLU] - Script de copie de dossier en BAT vers plusieurs [...]
[RESOLU] Remplacer une date si < date du jour[Résolu]Union?
Plus de sujets relatifs à : [Self-Résolu] Port Série (COM) et WriteFile()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR