//--------------------------------------------------------------------------- #pragma hdrstop #include "UCom.h" //--------------------------------------------------------------------------- #pragma package(smart_init) // VARIABLE GLOBALE ErrCom EtatCom= ErrCom_None; // Variable des erreurs de com Com::Com() { } Com::~Com() { } AnsiString Com::InitCom() { COM = ""; DWORD DeviceIndex; 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,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL); if(hdl == INVALID_HANDLE_VALUE) { // Echec EtatCom=ErrCom_Creation; } else { // On vide les buffers //PurgeComm(hdl,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); // 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; //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; unsigned long NCarLus; if(hdl!=NULL) { //on pari sur pas d'erreur EtatCom=ErrCom_None; //Pour éviter de gérer un time out Sleep((unsigned long)500); //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,sizeof(lpBuf),&NCarLus,NULL)==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; }