salut a tous et a toutes!
voila j'ai un petit pb avec mon programme portant sur la communication RS232:
en fait je reçoit une trame de 19 caractères et lors de la lecture de cette trame j'effectue une vérification de checksum afin de verifier si il n'y pas d'anomalies!
cette étape fonctionne par contre maintenant j'aimerai vérifier si présence d'une erreur de checksum ou de parité et corriger l'eventuel erreur enfin de recevoir une trame correct!
si quelqu'un c'est comment faire... plize help me!! Thanks ;-)
KeKeNoOb!
voici mon source:
#pragma package(smart_init)
#pragma argsused
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include "rs232.h"
//--------------------------PROTOTYPES----------------------------------------//
unsigned long checksum(char * Byte, unsigned long checksum);
//-----------------------------Fonction Main----------------------------------//
int main(void)
{
HANDLE hPort; /* Spécification de la communication */
char *Port;
int NPort;
int i;
cout<<"Tapez 1 pour COM1 ou 2 pour le COM2"<<endl;
cin>>NPort;
switch(NPort)
{
case 1 : Port="COM1";
break;
case 2 : Port="COM2";
break;
}
//LPSTR lpszPortName = _T("COM2");
hPort = CreateFile (Port,GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
//-------structure définissant les paramètres de la communication série-------//
DCB PortDCB;
PortDCB.DCBlength = sizeof (DCB);
PortDCB.BaudRate = 9600;
PortDCB.fBinary = TRUE;
PortDCB.fParity = TRUE;
PortDCB.fOutxCtsFlow = FALSE;
PortDCB.fOutxDsrFlow = FALSE;
PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
PortDCB.fDsrSensitivity = FALSE;
PortDCB.fTXContinueOnXoff = TRUE;
PortDCB.fOutX = FALSE;
PortDCB.fInX = FALSE;
PortDCB.fErrorChar = FALSE;
PortDCB.fNull = FALSE;
PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
PortDCB.fAbortOnError = FALSE;
PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
//----------------------------------------------------------------------------//
//Récupération des informations enregistées du port série dans notre structure.
GetCommState (hPort, // instance d'accès de votre port série
&PortDCB); // Structure de configuration
DWORD dwNbBitEcris;
//char Byte[21];
char * Byte;
Byte = new char[19];
cout<<"Lecture de trame :"<<endl;
//int taille;
/*taille = /*Byte, Bytes;*/
int Alire=19;//StrLen(Byte);
unsigned long Byte1;
//ReadFile (hPort,Byte,Alire,&dwNbBitEcris,NULL) ;
//--Boucle répititive permettant la lecture de trame envoyer par le lecteur---//
while(1)
{
ReadFile (hPort,Byte,Alire,&dwNbBitEcris,NULL) ;
checksum(Byte,Byte1);
PurgeComm(hPort,PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT);
ResetEvent(hPort);
SetupComm(hPort,20,20);
((LPBYTE)Byte)[dwNbBitEcris] = '\0';
}
//---------------------Fermeture de la communication série--------------------//
BOOL CloseHandle(
HANDLE hObject //Instance d'accès du port série
);
}
//****************************************************************************//
//--------------Vérification de la somme de contrôle (CHECKSUM)---------------//
unsigned long checksum(char * Byte, unsigned long checksum)
{
unsigned long Byte1= 0;
for (int i=0;i<16;i++)
{
Byte1 += Byte[i];
}
checksum = Byte[16]* 256 + Byte[17];
if (Byte1 == checksum)
{
cout << "pas d'erreur de checksum -->" ;
cout << Byte<<endl;
}else
cout << "Erreur checksum" <<endl;
return checksum;
}