Probleme rs232

Résolu
cs_rhumone Messages postés 3 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 23 décembre 2005 - 22 déc. 2005 à 15:39
cs_rhumone Messages postés 3 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 23 décembre 2005 - 23 déc. 2005 à 15:05
j'arrive pas a récupérer la totalitée des données sur ma liaison rs232 je dois recevoir environ 7000 octet j'en recois que 4000 octet.

voila mon source:

e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
{
g_ErrCom = e_ErrCom_None;


// On ouvre le port série
g_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);


if(g_hCom == INVALID_HANDLE_VALUE)
{
// Echec
g_ErrCom=e_ErrCom_Creation;
}
else
{
// On vide les buffers
PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);


// On paramètre le port série
g_DCB.DCBlength = sizeof(DCB);
//Configuration actuelle
GetCommState(g_hCom, &g_DCB);
//Modification du DCB
g_DCB.BaudRate=BaudRate;
g_DCB.ByteSize=BitsSize;
g_DCB.Parity=Parity;
g_DCB.StopBits=StopBits;
g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
//Configuration de la liaison serie
SetCommState(g_hCom,&g_DCB);
}
return g_ErrCom;
}


//----------------------------------------------------------------------------
// FONCTION : EmissionCom
//----------------------------------------------------------------------------
// DESCRIPTION :
// Emission d'octets sur la liaison série
//
//----------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur les octets a emettre
// -nCount Nombre d'octet a emettre
//
//----------------------------------------------------------------------------
// RETOUR :Code d'erreur
//----------------------------------------------------------------------------
e_ErrCom EmissionCom(const void* lpBuf,unsigned int nCount)
{


DWORD NumBytes=0;


if(g_hCom!=NULL)
{
// On pari sur pas d'erreur
g_ErrCom=e_ErrCom_None;


//Emission du buffer
if(WriteFile(g_hCom,lpBuf,nCount,&NumBytes,NULL)==0)
{
g_ErrCom=e_ErrCom_Emission;
}
}
else
//Le port n'a pas été ouvert
g_ErrCom=e_ErrCom_Creation;


return g_ErrCom;


}


//---------------------------------------------------------------------------
// FONCTION : ReceptionCom
//---------------------------------------------------------------------------
// DESCRIPTION :
// Reception de caractères sur la liaison série
//
//---------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur le buffer de caractère a lire
// -nCountMax Nombre maxi de caractère a lire
// -pCountRead Pointeur sur le nombre de caractères lus
//---------------------------------------------------------------------------
// RETOUR :Code d'erreur
//---------------------------------------------------------------------------
e_ErrCom ReceptionCom(void* Buffer,int nCountMax,int* CountRead)
{
COMSTAT Stat;
DWORD Errors;
int nCarALire;
unsigned long NCarLus=0;


if(g_hCom!=NULL)
{
//on pari sur pas d'erreur
g_ErrCom=e_ErrCom_None;


//Pour éviter de gérer un time out
Sleep(500);


//Pour connaitre le nombre d'octets dans le buffer d'entrée
ClearCommError(g_hCom,&Errors,&Stat);
nCarALire=Stat.cbInQue;


//On effectue la lecture si il y a des caractères présents
if( (nCarALire>0)&&(nCarALire<=nCountMax) )
{
if(ReadFile(g_hCom,Buffer,nCarALire,&NCarLus,NULL)==0)
{
g_ErrCom=e_ErrCom_Reception;
}


}
*CountRead=NCarLus;
}
else
//Le port n a pas été ouvert
g_ErrCom=e_ErrCom_Creation;


//Compte rendu de l'exécution
return g_ErrCom;


}


//-----------------------------------------------------------------------
// FONCTION : FermeCom
//-----------------------------------------------------------------------
// DESCRIPTION :
// Ferme le port série préalablement ouvert avec OuvreCom
//
//-----------------------------------------------------------------------
// PARAMETRES :
// Néant
//-----------------------------------------------------------------------
// RETOUR :Néant
//-----------------------------------------------------------------------
void FermeCom()
{
if(g_hCom!=NULL)
{
CloseHandle(g_hCom);
}
}

4 réponses

psyko_flex Messages postés 23 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 23 novembre 2022
23 déc. 2005 à 12:22
Dans la fonction ouvre com,tu doit utiliser des variables globale,
regarde : suivant ta configuration :

g_DCB.Parity=Parity;
g_DCB.StopBits=StopBits;

tu as mis koi dans parity et StopBites?

si tu a un bit stop et une parité par ex met ca au lieu de t 2 ligne


g_DCB.StopBits=ONESTOPBIT
g_DCB.Parity=NOPARITY
3
cs_CurieuxDeSavoir Messages postés 7 Date d'inscription lundi 6 décembre 2004 Statut Membre Dernière intervention 23 décembre 2005
23 déc. 2005 à 14:36
//Pour éviter de gérer un time out
Sleep(500);

Ca fait une pause enorme !!!
Mais bon, faut voir avec ton Buffer et nCountMax dans ta reception s'ils sont assez grand pour stocker.
Il faut aussi voir si Sleep(500) n'est pas trop exagéré pour ton g_DCB.BaudRate=BaudRate

//On effectue la lecture si il y a des caractères présents
if( (nCarALire>0)&&(nCarALire<=nCountMax) )
{
if(ReadFile(g_hCom,Buffer,nCarALire,&NCarLus,NULL)==0)
{
g_ErrCom=e_ErrCom_Reception;
}
}
!!!!! ici !!!!! met un else et regarde si tu n'entre pas dedans
3
cs_rhumone Messages postés 3 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 23 décembre 2005
23 déc. 2005 à 15:02
en faite je les ai déclaré en variable global donc le probleme vient pas de la.
Parity=NOPARITY
StopBits=ONESTOPBIT
3
cs_rhumone Messages postés 3 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 23 décembre 2005
23 déc. 2005 à 15:05
mon buffer est assez grand c sur mais ncountmax est surement tro petit.
j'avais mis sleep(500) car je pensais qu'il lisez tro vite dans le buffer de la rs232 et donc il lisez pas tout.

je vais essayer ce que tu ma dis
merci bcps pour ton aide.
3
Rejoignez-nous