nicolebarge23
Messages postés4Date d'inscriptionmardi 22 avril 2008StatutMembreDernière intervention 9 juin 2008
-
6 mai 2008 à 11:40
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013
-
6 mai 2008 à 15:55
Bonjour,
Après de nombreuses recherches sur le net, j'ai réussis à lire des données provenant d'un émetteur analogique par l'intermédiaire du port COM (RS232).
Cet émetteur envoie 14 trames de 8bits. Je suis capable de les récupérer et de les lire. J'arrive ainsi à faire la conversion en hexa des octets reçus.
Mon soucis est que maintenant je voudrais envoyer à mon tour, par l'intermédiaire du port COM, 14 trames de 8 bits à un récepteur. Je suis quasiment certain que le buffer utilisé dans la fonction writefile(...) contient les données désirées.
Par contre lorsque je teste ma fonction en reliant 2 PCs par le port COM, je ne reçois pas les mêmes données envoyées.
Les données reçues ont changé. Je suis certain de ma fonction de récupération des trames.
Je voudrais savoir s'il est possible que ce soit ma liaison qui fasse que des données ont changés.
Ci-joint ma fonction de récupération des données avec conversion en hexa. ainsi que ma fonction d'envoi de donnnées !!
#include // pour CIN & COUT
#include // pour le format de ces flux
#include <windows.h> // pour utiliser les API32
#include <stdio.h> // pour exploiter les Entrées/Sorties standards
#include <conio.h> // pour exploiter les Entrées/Sorties standards
#include <sstream>
#define aaxan 0x85 //Symbole du "à" en code page 437
#define aigu 0x82 //Symbole du "é" en code page 437
#define grave 0x8A //Symbole du "è" en code page 437
#define cdie 0x87 //Symbole du "ç" en code page 437
//********************************************************************
// Test des API32 de gestion du port série
//********************************************************************
void receptionTrame(void)
{
int NbDonnees;
int Vitesse;
unsigned char Parite;
char NomPort[4+1];
int NoPort ;
BOOL retour;
COMSTAT EtatCom;
DWORD CodeErreur ;
//NbOctetsEcrits ;
DWORD NbOctetsALire=NULL;
DWORD NbOctetsLus,i ;
//LPCVOID buffer;
int Nbstop;
BYTE BufferOut[10]={1,5,9,11,18,14,55,127,19,24};
BYTE *BufferIn;
HANDLE hCom; // le port est référencé avec un identifiant de type HANDLE
printf("\nEntrer le num%cro du port s%crie ",aigu,aigu);
scanf("%d",&NoPort);
//----------- Ouverture du port ------------------
sprintf(NomPort,"COM%d",NoPort);
hCom=CreateFile(NomPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING ,0,NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
// Handle the error.
printf ("CreateFile failed with error %d.\n", GetLastError());
return ;
}
//------------Config du port----------------------
DCB dcb; //Une structure "Device-Control Block" definit
//l'initialisation
// d'un périphérique de communications.
retour = GetCommState(hCom,&dcb); // Lecture des paramétres physiques.
if (retour == 0)
{
// Handle the error.
printf ("GetCommState failed with error %d.\n", GetLastError());
return ;
} // Si rien, alors pas de périphérique.
else // Si présence port, alors définir :
{
dcb.ByteSize=NbDonnees; // -Nombre de bits de Données
dcb.StopBits=Nbstop; // -Nombre de bit(s) de Stop
dcb.Parity=Parite; // -Type de parité
dcb.BaudRate=Vitesse; // -Vitesse de transfert des données
retour = SetCommState(hCom,&dcb); // Ecriture de ces paramètres.
}
getch();
retour = ClearCommError(hCom,&CodeErreur,&EtatCom);
if (!retour)
{
// Handle the error.
printf ("ClearCommError failed with error %d.\n", GetLastError());
return ;
} // Si rien, alors pas de périphérique.
else // Si présence port, alors définir :
{
NbOctetsALire = EtatCom.cbInQue;
}
//--------- Lecture de tous les octets reçus et stockage dans le tableau BufferIn---
BufferIn=new BYTE[NbOctetsALire];
// Allocation dynamique
retour=ReadFile(hCom , BufferIn , NbOctetsALire , &NbOctetsLus , NULL);
if (!retour)
{
printf("Could not read to file (error %d)\n", GetLastError());
return;
}
cout<<"NbOctetsLus : "<<NbOctetsLus<<endl;
cout<<"NbOctetsALire : "<<NbOctetsALire<<endl;
cout<<"BufferIn : "<
#include <tchar.h>
#include // pour CIN & COUT
#include // pour le format de ces flux
#include <windows.h> // pour utiliser les API32
#include <stdio.h> // pour exploiter les Entrées/Sorties standards
#include <conio.h> // pour exploiter les Entrées/Sorties standards
#include <sstream>
#include <string>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
cout<<"Entrez le nom du port desire :"<<endl;
scanf("%s",&PORTNOM);
strcpy(PORT,PORTNOM);
TEST_STR = "1253";
hFile = CreateFile(PORT, // name of the write
GENERIC_WRITE, // open for writing
0, // do not share
NULL, // default security
CREATE_ALWAYS, // overwrite existing
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
// Handle the error.
printf ("CreateFile failed with error %d.\n", GetLastError());
return ;
}
// Build on the current configuration, and skip setting the size
// of the input and output buffers with SetupComm.
dcb.DCBlength = sizeof(DCB);
if (!GetCommState(hFile, &dcb))
{
// Handle the error.
printf ("GetCommState failed with error %d.\n", GetLastError());
return ;
}
// Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.
dcb.BaudRate = 9600; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit
if (!SetCommState(hFile, &dcb))
{
// Handle the error.
printf ("SetCommState failed with error %d.\n", GetLastError());
return ;
}
_tprintf (TEXT("Serial port %s successfully configured.\n"), PORT);
//création de la trame à envoyer
DWORD trame[sizeof(DWORD)];
int binaire0;
int binaire1;
DWORD octet1;
DWORD octet2;
char MESSAGE[sizeof(char)];
//Génération du tableau
for (int i=0;i<28
;i++)
{
cout<<"trame [ "<<i<<" ] :"<<flush;
scanf("%s",&MESSAGE);
if ( MESSAGE[0]=='F' ) binaire0=15;
if ( MESSAGE[0]=='E' ) binaire0=14;
if ( MESSAGE[0]=='D' ) binaire0=13;
if ( MESSAGE[0]=='C' ) binaire0=12;
if ( MESSAGE[0]=='B' ) binaire0=11;
if ( MESSAGE[0]=='A' ) binaire0=10;
if ( MESSAGE[0]=='9' ) binaire0=9;
if ( MESSAGE[0]=='8' ) binaire0=8;
if ( MESSAGE[0]=='7' ) binaire0=7;
if ( MESSAGE[0]=='6' ) binaire0=6;
if ( MESSAGE[0]=='5' ) binaire0=5;
if ( MESSAGE[0]=='4' ) binaire0=4;
if ( MESSAGE[0]=='3' ) binaire0=3;
if ( MESSAGE[0]=='2' ) binaire0=2;
if ( MESSAGE[0]=='1' ) binaire0=1;
if ( MESSAGE[0]=='0' ) binaire0=0;
if ( MESSAGE[1]=='F' ) binaire1=15;
if ( MESSAGE[1]=='E' ) binaire1=14;
if ( MESSAGE[1]=='D' ) binaire1=13;
if ( MESSAGE[1]=='C' ) binaire1=12;
if ( MESSAGE[1]=='B' ) binaire1=11;
if ( MESSAGE[1]=='A' ) binaire1=10;
if ( MESSAGE[1]=='9' ) binaire1=9;
if ( MESSAGE[1]=='8' ) binaire1=8;
if ( MESSAGE[1]=='7' ) binaire1=7;
if ( MESSAGE[1]=='6' ) binaire1=6;
if ( MESSAGE[1]=='5' ) binaire1=5;
if ( MESSAGE[1]=='4' ) binaire1=4;
if ( MESSAGE[1]=='3' ) binaire1=3;
if ( MESSAGE[1]=='2' ) binaire1=2;
if ( MESSAGE[1]=='1' ) binaire1=1;
if ( MESSAGE[1]=='0' ) binaire1=0;
octet1=binaire0*16;
octet2=binaire1;
trame[i] = octet1+octet2;
}
BYTE *BufferOut;
BufferOut = new BYTE[28];
for (i=0;i<28;i++)
{
BufferOut[i] = trame[i];
};
getch();
cout<<"BufferOut final :"<<BufferOut<<endl;
cout<<"BufferOut final :"<<(DWORD)BufferOut<<endl;
DWORD NbOctetsaEcrire;
NbOctetsaEcrire = i;
cout<<"nb octets a ecrire :"<<NbOctetsaEcrire<<endl;
getch();
if(!WriteFile (hFile, &BufferOut, NbOctetsaEcrire, &dwResult, NULL))
{
printf("Could not write to file (error %d)\n", GetLastError());
return;
}
getch();
cout<<"Wrote to "<<!PORTNOM<<" successfully"<<endl;
cout<<"nombre de bits ecrits :"<<dwResult<<endl;
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 6 mai 2008 à 15:55
Salut,
Je ne pense pas que ton problème soit liés à ta liaison. En RS232 la com ne se fait que sur 1broche donc quasi aucune chance pour que les données soient altérées.
Pour en etre sure recupere un des codes sources de ymca2003 sur ce site et testes ta com entre tes deux PC.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 6 mai 2008 à 15:55
Salut,
Je ne pense pas que ton problème soit liés à ta liaison. En RS232 la com ne se fait que sur 1broche donc quasi aucune chance pour que les données soient altérées.
Pour en etre sure recupere un des codes sources de ymca2003 sur ce site et testes ta com entre tes deux PC.