VinceA | 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 :
- #include <stdio.h>
- #include <windows.h>
- #include <stdlib.h>
- // CreateFile()
- #define dwDesiredAccess GENERIC_READ | GENERIC_WRITE
- #define dwShareMode 0
- #define CreateDisposition OPEN_EXISTING
- #define Flag FILE_FLAG_OVERLAPPED
- // PurgeComm()
- #define dwFlags PURGE_RXCLEAR | PURGE_TXCLEAR
- HANDLE WINAPI Init(char*); // Retourne le HANDLE de COM1
- void Ecrire_COM(HANDLE, char); // passe ces deux arg à WriteFile()
- char Lire_COM(HANDLE);
- int main(int argc, char *argv[]) {
- HANDLE hCom = Init("COM1" ); // hCOM = HANDLE COM1
- int Success;
- char car = 'a';
- unsigned long written;
- /* PROGRAMME DE TEST */
- Ecrire_COM(hCom, 'a');
- /* FIN */
- /* FERMETURE DU HANDLE, FIN DU PROGRAMME */
- Success = CloseHandle(hCom);
- if(!Success) {
- printf("Impossible de fermer le HANDLE" );
- return -1;
- }
- printf("HANDLE fermé. Fin du programme." );
- return 0;
- }
- HANDLE WINAPI Init(char* COM) { // FONCTION D'INITIALISATION
- DCB dcb;
- HANDLE hCom;
- int Success;
- hCom = CreateFile(COM, dwDesiredAccess, dwShareMode, NULL, CreateDisposition, Flag, NULL);
- // RECUPERE HANDLE SUR PORT COM
- if( hCom == INVALID_HANDLE_VALUE) { // HANDLE invalide ?
- printf("Erreur lors de la création du HANDLE hCom.\n" );
- printf("Le port ne peut pas être ouvert ?\n" );
- return hCom;
- }
- else { // HANDLE valide
- Success = GetCommState(hCom, &dcb); // Copie de DCB
- if(!Success) // Copie de DCB ratée
- printf("Copie de DCB raté.\n" );
- else { // MODIFICATION DE DCB
- dcb.fParity = NOPARITY; // 0 parité
- dcb.BaudRate = 1200; // 1200b/s
- dcb.ByteSize = 8; // Mot d'un octet (8 bits)
- dcb.StopBits = ONESTOPBIT; // 1 bit de stop
- Success = SetCommState(hCom, &dcb); // Reinit COM
- if(!Success) // COM1 n'utilise pas notre DCB
- printf("Impossible de réinitialiser le port série." );
- else { // COM1 UTILISE NOTRE DCB
- Success = PurgeComm(hCom, dwFlags);
- if(!Success) // Impossible de vider les buffers
- printf("Purge des buffers échouée." );
- else { // buffers vidés
- printf("Port série prêt, avec les paramètres désirés.\n" );
- return hCom;
- }
- }
- }
- }
- }
- void Ecrire_COM(HANDLE hCom, char caractere) {
- int Success;
- DWORD written; // nombre de caractère écrit [inutile mais nécessaire...]
- Success = WriteFile(hCom, &caractere, 1, &written, NULL);
- if(Success == 0) { // Echec de WriteFile()
- printf("Ecriture échouée.\n\n" );
- written = GetLastError();
- printf("Erreur n° %d\n\n", written);
- }
- else
- printf("Ecriture réussie." );
- }
|
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
|