SOS reception et affichage sur port serie

Signaler
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008
-
cs_dgac
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008
-
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;
}


 

7 réponses

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
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!

Shell
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008

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
Messages postés
149
Date d'inscription
mercredi 28 mars 2007
Statut
Membre
Dernière intervention
17 mai 2007
1
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
@++

Une autruche ne se cuit pas aux petits lardons.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
ReadFile retourne une valeur de type BOOL. En gros, elle retourne TRUE ou FALSE et non le nombre d'octets lue. Le 4ème paramètre est fait pour ça.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Et puis, si ce n'est que pour lire qu'un seul caractère, inutile de déclarer un buffer d'un ko. Simplement à faire

char c;
ReadFile(hfile, &c, 1, &byte, 0);

Je te conseil aussi vivement les sources de ymca2003 pour ce genre de chose.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Voici:
http://www.cppfrance.com/codes/COMMUNICATION-SERIE-RS232-WIN32_18704.aspx
C'est en C++ mais l'utilisation du port série reste la même.

C++ (@++)<!--
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008

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.