StormEnnairo
Messages postés4Date d'inscriptionvendredi 24 février 2012StatutMembreDernière intervention27 février 2012
-
24 févr. 2012 à 13:55
StormEnnairo
Messages postés4Date d'inscriptionvendredi 24 février 2012StatutMembreDernière intervention27 février 2012
-
27 févr. 2012 à 18:42
Hello World ! (svp permettez moi ce jeu de mot à la noix)
Bon j'espère que quelqu'un poura maider, je débute en C, et j'assayes d'ecrire et lire des données dans le port com.
Après m'être plongé la dans des pages et des pages du manuel de l'API windows, de tutos en anglais et de m'être inspiré du travail de quelqu'un qui fonctionne (j'ai bien dit INSPIRE, pas plagié !), j'ai réussie à pondre mon propre code. Mais voila je n'arrive pas à configurer la variable de configuration du port com. Alors si quelqu'un trouve la connerie que je n'ai pas réussi à corrigé moi même (depuis deux jour et demie) dite le moi !
Merci de votre aide !
Voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define RX_SIZE 4096 //taille InPut
#define TX_SIZE 4096 // taille OutPut
#define MAX_WAIT_READ 5000 //temps max de lecture (en ms)
/*Declaration des fonctions que main utilisera
*/
// Variable de Configuration des ports coms
DCB PCConf =
{
sizeof(DCB), // DCBlength
9600, // BaudRate
TRUE, // fBinary
FALSE, // fParity
FALSE, // fOutxCtsFlow
FALSE, // fOutxDsrFlow
DTR_CONTROL_ENABLE, // fDtrControl
FALSE, // fDsrSensitivity
FALSE, // fTXContinueOnXoff
FALSE, // fOutX
FALSE, // fInX
FALSE, // fErrorChar
FALSE, // fNull
RTS_CONTROL_ENABLE, // fRtsControl
FALSE, // fAbortOnError
0, // fDummy2
0, // wReserved
0x100, // XonLim
0x100, // XoffLim
8, // ByteSize
NOPARITY, // Parity
ONESTOPBIT, // StopBits
0x11, // XonChar
0x13, // XoffChar
'?', // ErrorChar
0x1A, // EofChar
0x10 // EvtChar
};
// variable configuration des delay atentes des pots com
COMMTIMEOUTS DelAtt =
{
MAX_WAIT_READ, /* ReadIntervalTimeOut */
0, /* ReadTotalTimeOutMultiplier */
MAX_WAIT_READ, /* ReadTotalTimeOutConstant */
0, /* WriteTotalTimeOutMultiplier */
0 /* WriteTotalTimeOutConstant */
};
int NCom = 0, nChoix, nBytesWritten, nBytesRead;
BOOL OpenCOM (int NCom) ; // protocole d'ouverture de port.
BOOL CloseCOM (); // protocole de fermeture
BOOL ReadCOM (void* buffer, int nBytesToRead, int* pBytesRead); //protocole lecture
BOOL WriteCOM (void* buffer, int nBytesToWrite, int* pBytesWritten); //protocole ecriture
HANDLE FPCom=NULL; // déclaration de la variable de stockage du port com (Fichier Port Com).
int main()
{
char buffer[256];
printf ("Port com a ouvrir :\n\n") ;
scanf("%d",&NCom) ;
OpenCOM(NCom);
if(!OpenCOM(NCom)) return -1;
printf("\nPort Com%d ouvert.\n",&NCom);
do
{
/* menu */
printf("\r\n");
printf("1 : Donnée en OutPut.\n");
printf("2 : Donnees en Input.\n");
printf("3 : Quitter.\n");
scanf("%d", &nChoix);
if(nChoix == 1) //OutPut
{
printf("\n");
printf("Donnees a envoyer :\n");
fflush(stdin); // fonction vider le buffer (memoire tampon) dans stdin.h
gets(buffer); // gets() contrairement a scanf n'est pas formate.
printf("\n");
printf("Envoi des donnees...\n");
if(WriteCOM(buffer, strlen(buffer), &nBytesWritten))
{
printf("%d octet(s) envoye(s).\n", nBytesWritten);
}
else
{
printf("Erreur lors de l'envoi.\n");
}
}
if(nChoix == 2) //InPut
{
printf("\n");
printf("Reception de donnees...\n");
if(ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead))
{
buffer[nBytesRead] = '\0';
printf("%d octet(s) recu(s) :\n%s\n", nBytesRead, buffer);
}
else
printf("Erreur lors de la réception.\r\n");
}
}while(nChoix != 3);
CloseCOM(); // on ferme pour quitter proprement
return 0;
}
BOOL OpenCOM(int NCom)
{
char ComN [16];
sprintf(ComN, "COM%d", NCom);
FPCom = CreateFile(ComN, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
if(FPCom ==INVALID_FILE_ATTRIBUTES)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
printf ("\nERREUR : Port introuvable\n");
}
printf ("\nERREUR : erreur lors de la connection.\n") ;
}
/*initialisations des parametre de communication (cmd API)*/
SetupComm(FPCom, RX_SIZE, TX_SIZE) ;
if(!SetCommTimeouts(FPCom, &DelAtt) || !SetCommState(FPCom, &PCConf))
{
printf("Erreur lors de la configuration du port COM%d", NCom);
CloseHandle(FPCom);
return FALSE;
}
/* on vide les tampons d'émission et de réception, mise à 1 DTR (cmd API) */
PurgeComm(FPCom, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
EscapeCommFunction(FPCom, SETDTR);
return TRUE;
}
BOOL CloseCOM()
{
CloseHandle(FPCom);
return TRUE;
}
BOOL ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead)
{
return ReadFile(FPCom, buffer, nBytesToRead, pBytesRead, NULL);
}
BOOL WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten)
{
return WriteFile(FPCom, buffer, nBytesToWrite, pBytesWritten, NULL);
}
A voir également:
Erreur de configuration du port COM, pour communication RS232
cs_louis14
Messages postés793Date d'inscriptionmardi 8 juillet 2003StatutMembreDernière intervention10 février 20218 27 févr. 2012 à 15:38
Bonjour,
comme tu as des messages d'erreur au cours de l'ouverture du port COM, il serait bien de les fournir afin de cerner la fonction en cause lors de l'ouverture.
as-tu essayé de remplacer FILE_ATTRIBUTE_SYSTEM par 0?
StormEnnairo
Messages postés4Date d'inscriptionvendredi 24 février 2012StatutMembreDernière intervention27 février 2012 27 févr. 2012 à 18:42
hum... en fait javais mis un lien qui semble avoir ete mal fait, en fait je me ss apercue demon erreur par hasard : en efft j'ouvre le port deux foix, la premier explicitement ligne 6eme ligne aps le main, et ine seconde fois implicitement, la ligne juste aprs.
Mais merci beaucoup pour t'etre penche sur le problem.
Bonne soiree !