cs_dgac
Messages postés18Date d'inscriptionmercredi 9 mai 2007StatutMembreDernière intervention19 mai 2008
-
9 mai 2007 à 10:27
cs_dgac
Messages postés18Date d'inscriptionmercredi 9 mai 2007StatutMembreDernière intervention19 mai 2008
-
10 mai 2007 à 09:25
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).
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
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 9 mai 2007 à 13:36
Regarde dans les sources de ymca2003 tu trouveras de quoi faire.
Puis essaye au moins de faire une recherche sur le forum avant de poster ton message car des réponses à cette question se comptent à la pelle!
cs_dgac
Messages postés18Date d'inscriptionmercredi 9 mai 2007StatutMembreDernière intervention19 mai 2008 9 mai 2007 à 14:45
J'avais déja regardé et fouillé dans le forum et sur google mais J'aurai besoin de 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
emmatopiak
Messages postés149Date d'inscriptionmercredi 28 mars 2007StatutMembreDernière intervention17 mai 20072 9 mai 2007 à 15:11
Salut,
Dans ta fonction reception, tu fais D = readFile(..., buffer, ...)
et après tu retournes ce D, mais le D est pas le char que tu attends, D t'indique combien de caractères sur les 1024 ont été lus (d'ailleurs ça devrait être un int).
Le char que tu recherches se trouve en buffer[0]
_donc pour tester je te conseille de faire
int D;
D = ReadFile(hCom, buffer, 1, &nbRead, NULL);
return buffer[0];
Bon essaye et dis moi si ça marche
@++
cs_dgac
Messages postés18Date d'inscriptionmercredi 9 mai 2007StatutMembreDernière intervention19 mai 2008 10 mai 2007 à 09:25
merci beaucoup de votre aide !!!LA reception marche avec la solution SAKingdom et l'utilité de déclarer un buffer de 1 ko (pour le test d un carractére) est de pouvoir recevoir des trames JBUS.