//--------------------------------------------------------------------------- #pragma hdrstop #include "UCom.h" //--------------------------------------------------------------------------- #pragma package(smart_init) // Nom du port s�rie #define PORT1 "COM1" #define PORT2 "COM2" // D�finition des vitesses de communication #define V1200 1200 #define V2400 2400 #define V4800 4800 #define V9600 9600 #define V38400 38400 // D�finition du nombre de bits de donn�e #define BITS_7 7 #define BITS_8 8 // D�finition du nombre de bits de stop #define BIT_DE_STOP_1 1 #define BIT_DE_STOP_2 2 // D�finition de la parit� #define PAS_DE_PARITE 'N' #define PARITE_IMPAIRE 'O' #define PARITE_PAIRE 'E' // Codes de retour g�n�riques #define OK 1 #define KO 0 // Longueur max r�serv�e pour une trame #define LG_TRAME 20 // VARIABLE GLOBALE ErrCom EtatCom= ErrCom_None; // Variable des erreurs de com Com::Com() { } Com::~Com() { } AnsiString Com::InitCom() { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; // Create a HDEVINFO with all present devices. hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_PORTS, 0, // Enumerator 0, DIGCF_PRESENT); if (hDevInfo == INVALID_HANDLE_VALUE) { // Insert error handling here. ShowMessage ("Erreur hDevInfo"); // return ; } // Enumerate through all devices in Set. DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (DeviceIndex=0;SetupDiEnumDeviceInfo(hDevInfo,DeviceIndex, &DeviceInfoData);DeviceIndex++) { DWORD DataT; LPTSTR buffer = NULL; DWORD buffersize = 0; while (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)buffer, buffersize, &buffersize)) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // Change the buffer size. if (buffer) LocalFree(buffer); // Double the size to avoid problems on // W2k MBCS systems per KB 888609. // soit // buffer = (char*)LocalAlloc(LPTR, buffersize * 2); // ou buffer = (PCHAR)LocalAlloc(LPTR, buffersize * 2); } else { // Insert error handling here. break; } } // On v�r�fie si c'est le bon hardware //if(strnicmp(buffer, "USB\\VID_0403&PID_6001", 21) == 0) if((stricmp(buffer, "FTDIBUS\\COMPORT&VID_0403&PID_6001")) == 0 || (stricmp(buffer, "USB\\VID_10C4&PID_EA60&REV_0100")) == 0) { HKEY hKey; char szPortName[256] = ""; DWORD len = 256; hKey = SetupDiOpenDevRegKey(hDevInfo, &DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); RegQueryValueEx(hKey, "PortName", NULL, NULL, szPortName, &len); RegCloseKey(hKey); //COM = "\\\\.\\" + AnsiString(szPortName); COM = AnsiString(szPortName); } } ShowMessage ("Base de collecte connect�e sur le port " + COM); return COM; } ErrCom Com::ConnectCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits) { EtatCom = ErrCom_None; // On ouvre le port s�rie hdl = CreateFile(strPort,(GENERIC_READ | GENERIC_WRITE), (FILE_SHARE_READ | FILE_SHARE_WRITE), 0 , OPEN_EXISTING, 0, 0); if(hdl == INVALID_HANDLE_VALUE) { // Echec EtatCom = ErrCom_Creation; } else { // On vide les buffers PurgeComm(hdl,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //Modifs //SetupComm(hdl,5000,5000); GetCommState(hdl, &dcb); // On param�tre le port s�rie dcb.DCBlength = sizeof(DCB); //Configuration actuelle GetCommState(hdl, &dcb); //Modification du DCB dcb.BaudRate=BaudRate; dcb.ByteSize=BitsSize; dcb.Parity=Parity; dcb.StopBits=StopBits; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fRtsControl = RTS_CONTROL_DISABLE; //Configuration de la liaison serie SetCommState(hdl,&dcb); } return EtatCom; } void Com::DisconnectCom () { if(hdl!=NULL) { CloseHandle(hdl); } } ErrCom Com::LectureCom (void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead) { COMSTAT Stat; DWORD Errors; unsigned int nCarALire; NCarLus = 0; COMMTIMEOUTS timeouts={0}; if(hdl!=NULL) { //on pari sur pas d'erreur EtatCom = ErrCom_None; //Pour �viter de g�rer un time out //Sleep((unsigned long)500); int TimeoutRead=500; timeouts.ReadIntervalTimeout=MAXWORD; timeouts.ReadTotalTimeoutMultiplier=0; timeouts.ReadTotalTimeoutConstant=TimeoutRead; timeouts.WriteTotalTimeoutMultiplier=0; timeouts.WriteTotalTimeoutConstant=0; SetCommTimeouts(hdl,&timeouts); //Pour connaitre le nombre d'octets dans le buffer d'entr�e ClearCommError(hdl,&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(hdl,lpBuf,nCarALire,&NCarLus,0)==0) { EtatCom = ErrCom_Reception; } } *pCountRead=NCarLus; } else //Le port n a pas �t� ouvert EtatCom = ErrCom_Creation; //Compte rendu de l'ex�cution return EtatCom; } ErrCom Com::EnvoiCom (const void* lpBuf,unsigned int nCount) { DWORD NumBytes=0; if(hdl!=NULL) { // On pari sur pas d'erreur EtatCom = ErrCom_None; //Emission du buffer if(WriteFile(hdl,lpBuf,nCount,&NumBytes,NULL)==0) { EtatCom = ErrCom_Emission; } } else //Le port n'a pas �t� ouvert EtatCom = ErrCom_Creation; return EtatCom; }