Reception port série

Résolu/Fermé
DGAC - 9 mai 2007 à 10:19
 DGAC2 - 15 mars 2008 à 22:12
J'ai dévellopé le programme suivant pour recevoir et afficher une chaine de carractére pour un port serie . J'aimerai de l'aide pour recevoir un carractére (la configuration du port a été testé et fonctionne).

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <conio.h>
#include <time.h>
HANDLE hCom;
int esclave,code,adressePF,adressepf,motPF,motpf,CRC_PF,CRC_pf;
char reception();

char reception()
{DWORD nb_read;
unsigned char buffer[1024];
char D;
D=ReadFile (hCom,buffer,sizeof(buffer),&nb_read,NULL);
return D;
}

void config_com()//fonction de configuration du port
{
DCB dcb;
int Data_size;//variable nombre de bits(7,8)
int Vitesse;//variable vitesse (4800bauds....)
int parity;//variable parité(impair,paire,sans)
int stop_bit;//variable nombre de bits stop (1, 1.5 , 2)
int COM;//variable du port
DWORD dwError;

printf("selection du COM utilise:1,2,3 ou 4\n");
scanf("%d",&COM);//saisie du port utilisé
switch(COM)//menu pour choix du port
{case 1:
hCom = CreateFile ("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
/*choix du port 1 en lecture écriture ,ouvre un fichier existant avec un accés
exclusif à ce périphérique. S’il est déjà ouvert, CreateFile échoue.*/
break;
case 2:hCom = CreateFile ("COM2",GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
/*choix du port 2 en lecture écriture ,ouvre un fichier existant avec un accés
exclusif à ce périphérique. S’il est déjà ouvert, CreateFile échoue.*/
break;
case 3:hCom = CreateFile ("COM3",GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
break;
case 4:hCom = CreateFile ("COM4",GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
break;
default:printf("erreur\n");
}
if (hCom == INVALID_HANDLE_VALUE) //fonction de test d'erreur d'ouverture du COM
{
dwError = GetLastError();
/* Fichier non créer Gérer l'erreur */
}

printf("selectionner le nombre de bits de donnees\n");
scanf("%d",&Data_size);//selection nombre de bits de donnees
printf("selectionner de la vitesse\n");
scanf("%d",&Vitesse);//selectionner de la vitesse
memset (&dcb,0,sizeof(dcb));
dcb.DCBlength = sizeof (dcb);//configure le port(taille)
dcb.BaudRate =Vitesse;//configure le port(vitesse)
dcb.ByteSize = Data_size;////configure le port(format)
printf("selectionner de la parite:\npaire=1\nimpaire=2 \nsans parite=3\n");
scanf("%d",&parity);//selectionner de la parité
switch(parity)//menu selection de la parité
{
case 1:dcb.Parity = EVENPARITY;//configure une Parité paire
break;
case 2:dcb.Parity = ODDPARITY;//configure une Parité impaire
break;
default :dcb.Parity = NOPARITY;//Pas de parité
}
printf("selectionner de le nombre de bit de stop\n");
printf("1=1bit de stop\n2=1.5bit de stop\n3=2 bits de stop\n");
scanf("%d",&stop_bit);//selection du nombre de bit de stop
switch(stop_bit)
{case 1:dcb.StopBits = ONESTOPBIT;//1 bit de stop
break;
case 2:dcb.StopBits = ONE5STOPBITS;//1.5 bit de stop
break;
default:dcb.StopBits = TWOSTOPBITS;// 2 bit de stop

}
if(!SetCommState (hCom,&dcb))//fonction de test de la configuration
{printf("erreur fatale");//si probléme de config on affiche un msg d'erreur
}
}


int main ()
{char R;
code=0;
config_com();//configure le port
do
{
R=reception();
printf("%c",R);
}while(1);
CloseHandle(hCom); //ferme le fichier

return 0;
}

4 réponses

Je serai trés intéressé d'avoir une réponse a ce message car j'ai environ le meme probléme pour la reception d une trame en JBUS
0
J'ai déja regardé et fouillé sur google et J'aurai besoin de géré l'affichage de ce que je recois afin de vérifier que ma fonction de réception est correcte.
ce qui a mon avis n'est pas le cas et je ne comprend pas pourquoi car quand je tappe
char reception()
{
DWORD nb_read;
unsigned char buffer[1024];
char D;
D=ReadFile (hCom,buffer,sizeof(buffer),&nb_read,NULL);
printf("%c",buffer);
return D;
}
je ne sort jamais de cette fonction (bloqué par le readfile) mais pourquoi et est ce que un readfile est suffisant pour recevoir et afficher quelquechose


Merci de votre aide
0
C peut etre bateau mais tu a mis un While(1) ....
0
salut dgac... je bosse sur un projet similaire au tien... tu es basé sur quel aéroport ?.
0