salut
je n'arrive pas a récupéré une valeur d'un octet dans un fichier texte envoyé par un pic"on appuie sur un boutton" au pc
par contre avec l'hyperterminal je récupéré des symboles
l'ouverture du port fonctionne
mais c'est la fonction réception ou je bloque
le fichier test est bien créer avec valeur 0 pour réponse
donc pouvez-vous me dire ou sont les erreurs dans mon programme?
Code:#include <stdlib.h> #include <stdio.h> #include <windows.h> #include <winbase.h> // CONSTANTES //------------------------------------------------------------------------------- // Définition du code d'erreurs typedef enum { e_ErrCom_None, // Pas d'erreur e_ErrCom_Creation, // Erreur lors de la création du flux e_ErrCom_Utilise, // Le port com est déjà utilisé e_ErrCom_Inexistant, // Le port com n'existe pas e_ErrCom_Timeout, // Timeout lors d'une émission-réception e_ErrCom_Emission, // Erreur lors de l'émission e_ErrCom_Reception, // Erreur lors de la réception e_ErrCom_Definition_Trame, // Erreur de définition de la trame e_ErrCom_Nack, // Demande non prise en coompte e_ErrCom_Checksum // Erreur de checksum } e_ErrCom; // Nom du port série #define PORT1 "COM1" #define PORT2 "COM2" // Définition des vitesses de communication #define V1200 1200 #define V2400 2400 #define V4800 4800 #define V9600 9600 // Définition du nombre de bits #define BITS_7 7 #define BITS_8 8 // Définition du nombre de bits de stop #define BIT_DE_STOP_1 1 #define BIT_DE_STOP_2 2 // Définition de la parité #define PAS_DE_PARITE 'N' #define PARITE_IMPAIRE 'O' #define PARITE_PAIRE 'E' // Codes de retour génériques #define OK 1 #define KO 0 // Longueur max réservée pour une trame #define LG_TRAME 100 // PROTOTYPES //---------------------------------------------------------------------------- e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits); e_ErrCom ReceptionCom(void *lpBuf, unsigned int nCountMax, unsigned int *pCountRead); void FermeCom(); DCB PortDCB; // structure dcb du port e_ErrCom g_ErrCom= e_ErrCom_None; // Variable des erreurs de com HANDLE g_hCom = 0; // handle de la com int main (int argc,char *argv[]) { FILE *fichier=NULL; int i=0; unsigned char buf[1]={0}; unsigned int pCountRead; g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PAS_DE_PARITE,BIT_DE_STOP_1); ReceptionCom( buf, sizeof(buf), &pCountRead); fichier = fopen("test.txt", "w"); if (fichier != NULL) { for (i=0;i<=pCountRead;i++) fprintf(fichier, "valeur %d", buf[0]); fclose(fichier); } FermeCom(); if ( g_ErrCom==0) { printf("pas d'erreur"); } } e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits) { g_ErrCom = e_ErrCom_None; // On ouvre le port série g_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL); if (g_hCom == INVALID_HANDLE_VALUE) { // Echec g_ErrCom=e_ErrCom_Creation; } else { // On vide les buffers PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); // On paramètre le port série PortDCB.DCBlength = sizeof(DCB); //Configuration actuelle GetCommState(g_hCom, &PortDCB); //Modification du DCB PortDCB.DCBlength = sizeof (DCB); PortDCB.BaudRate = 9600; PortDCB.fBinary = TRUE; PortDCB.fParity = FALSE; PortDCB.fOutxCtsFlow = FALSE; PortDCB.fOutxDsrFlow = FALSE; PortDCB.fDtrControl = DTR_CONTROL_ENABLE; PortDCB.fDsrSensitivity = FALSE; PortDCB.fTXContinueOnXoff = FALSE; PortDCB.fOutX = FALSE; PortDCB.fInX = FALSE; PortDCB.fErrorChar = FALSE; PortDCB.fNull = FALSE; PortDCB.fRtsControl = RTS_CONTROL_ENABLE; PortDCB.fAbortOnError = FALSE; PortDCB.ByteSize = 8; PortDCB.Parity = NOPARITY; PortDCB.StopBits = ONESTOPBIT; //Configuration de la liaison serie SetCommState(g_hCom,&PortDCB); } return g_ErrCom; } //--------------------------------------------------------------------------- // FONCTION : ReceptionCom //--------------------------------------------------------------------------- // DESCRIPTION : // Reception de caractères sur la liaison série // //--------------------------------------------------------------------------- // PARAMETRES : // -lpBuf Pointeur sur le buffer de caractère a lire // -nCountMax Nombre maxi de caractère a lire // -pCountRead Pointeur sur le nombre de caractères lus //--------------------------------------------------------------------------- // RETOUR :Code d'erreur //--------------------------------------------------------------------------- e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead) { COMSTAT Stat; DWORD Errors; unsigned int nCarALire; unsigned long NCarLus=0; if (g_hCom!=NULL) { //on pari sur pas d'erreur g_ErrCom=e_ErrCom_None; //Pour éviter de gérer un time out Sleep(500); //Pour connaitre le nombre d'octets dans le buffer d'entrée ClearCommError(g_hCom,&Errors,&Stat); nCarALire=Stat.cbInQue; //On effectue la lecture si il y a des caractères présents if ( (nCarALire>0)&&(nCarALire<=nCountMax) ) { if (ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0) { g_ErrCom=e_ErrCom_Reception; } } *pCountRead=NCarLus; } else //Le port n a pas été ouvert g_ErrCom=e_ErrCom_Creation; //Compte rendu de l'exécution return g_ErrCom; } void FermeCom() { if (g_hCom!=NULL) { CloseHandle(g_hCom); } }
-----