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

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

Marsh Posté le 17-11-2009 à 20:19:30    

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
Reply

Marsh Posté le 17-11-2009 à 20:19:30   

Reply

Marsh Posté le 18-11-2009 à 10:51:34    

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
Reply

Marsh Posté le 21-04-2012 à 14:50:52    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed