#include "class_RS232.h"
#include <stdlib.h>
#include <conio.h>
#include
#include <string.h>
#include <windows.h>
#include "class_RS232.h"
#include
#include <winbase.h>
using namespace std;
#define RX_SIZE 4096 /* taille tampon d'entrée */
#define TX_SIZE 4096 /* taille tampon de sortie */
#define MAX_WAIT_READ 5000 /* temps max d'attente pour lecture (en ms) */
void class_RS232::connexion_port(int NumPort, int baude_rate, int taille_data, bool bit_parity)
{
char sizeCom[6];
sprintf(sizeCom, "COM%d", NumPort);
hCom = CreateFileA(sizeCom,
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // pas de securité
OPEN_EXISTING, // devices OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);
if (hCom == INVALID_HANDLE_VALUE)
{
std::cout << "probleme dans l'ouverture du port com " << GetLastError();
fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess)
{
std::cout << "erreur lors de la configuration du port " << GetLastError();
}
dcb.BaudRate = baude_rate; //CBR_9600; // baud rate
taille_data dcb.ByteSize taille_data; //8; // taille data, xmit, rcv
dcb.Parity = bit_parity; //NOPARITY; // no parity bit
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess)
{
std::cout << "erreur lors de la configuration du port " << GetLastError();
}
}
}
class_RS232::class_RS232()
{
int TimeoutRead = 500;
g_cto.ReadIntervalTimeout = MAX_WAIT_READ;
g_cto.ReadTotalTimeoutMultiplier = 0;
g_cto.ReadTotalTimeoutConstant = TimeoutRead;
g_cto.WriteTotalTimeoutMultiplier = 0;
g_cto.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hCom,&g_cto);
}
class_RS232::~class_RS232()
{
}
bool class_RS232::ReadCOM(unsigned char* P_messageRecu, int nBytesToRead, DWORD* NombreCarRecu)
{
//return ReadFile(g_hCOM, buffer, nBytesToRead, (LPDWORD)pBytesRead, NULL);
cout << "ReadCom" << endl;
return ReadFile(hCom, P_messageRecu, nBytesToRead, NombreCarRecu, NULL);
//std::cout << " nbre caractere ecrit :" << NombreOctetsEcrits;
}
bool class_RS232::WriteCOM(unsigned char* Trame_a_Envoyer, int nBytesToWrite, DWORD*NombreOctetsEcrits)
{
return WriteFile(hCom, Trame_a_Envoyer, nBytesToWrite, NombreOctetsEcrits, NULL);
}
bool class_RS232::CloseCOM()
{
CloseHandle(hCom);
cout << "Close Done" << endl;
return true;
}
Mon soucis est le suivant : Le code marche mais je suis obliger dans ma fonction ReadCOM et WriteCom de marquer le nombres de caractere qui sera envoyé et reçus , mais selon la trame envoyer et la configuration du module qui reçoit ma trame la reponse sera plus ou moins grande c'est pour cela que je cherche une solution permettant d'evité de noter en brut le nombres de caractère qui sera lus dans ma fonction Readfile.
j'ai trouvé la solution du timeout pour faire en sorte que lorsque le delais entre la reception des caractères est trop long il coupe la connexion , mais je sait pas comment m'en servir pour eviter de rentrer en dur le nombre de caractère à lire .
J'espère etre claire dans mes explications , sinon expliqué moi ce que vous ne comprenais pas et j'essayerai d'etre plus claire.
cs_louis14
Messages postés793Date d'inscriptionmardi 8 juillet 2003StatutMembreDernière intervention10 février 20218 1 févr. 2012 à 09:23
Bonjour,
Si tu as dans tes trames un caractère de fin de message, tu peux aussi voir à détecter le caractère de fin de message , mais avec le time out en plus.
Tu peux chercher les fichier de SerialEx de Ramon de Klein, http://www.codeproject.com/KB/system/serial.aspx?msg=328248 qui contient la solution à ton problème.
Bon codage
virtuoze
Messages postés7Date d'inscriptionjeudi 26 janvier 2012StatutMembreDernière intervention 2 février 2012 2 févr. 2012 à 15:06
Je suis aller voir ton lien Louis mais je t'avourais que ca ne pas pas aider plus que sa .
Je ne trouve toujours pas le moyens d'éviter de rentrer en dur le nombre de caractère à recevoir.