SOS reception et affichage sur port serie

cs_dgac Messages postés 18 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 19 mai 2008 - 9 mai 2007 à 10:27
cs_dgac Messages postés 18 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 19 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).


#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

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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!

Shell
0
cs_dgac Messages postés 18 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 19 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
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
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
@++

Une autruche ne se cuit pas aux petits lardons.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 mai 2007 à 15:33
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++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 mai 2007 à 15:38
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 mai 2007 à 15:50
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++ (@++)<!--
0
cs_dgac Messages postés 18 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 19 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.
0
Rejoignez-nous