chenech |
07-04-2022 00:07:15 |
API de Windows
Cita:
Empezado por chinchan
(Mensaje 541493)
Hola y saludos a todos los del foro. Cuando programaba en C++ Builder6 utilizaba los componentes ComPort para comunicarme por el puerto serie (de eso hace ya tiempo). Ahora utilizo el el Embarcadero XE y por más que he buscado, no encuentro estos componentes para el Builder XE5. ¿Sabéis si existen para este compilador?, ¿Sabéis si hay otros componentes que pueda utilizar?... Muchas gracias.
|
Yo lo he echo siempre con llamadas al API de Windows, así no dependo de terceros y complia en cualquier versión desde la 1 hasta la 11.
Te paso un ejemplo que tengo para comunicar con una pesa, ReadFile y WriteFile se encargan de leer o grabar en el puerto:
Código:
HANDLE hComm;
DCB dcbCommPort;
COMMTIMEOUTS ctmoNew = {0};
DWORD dwBytesRead, dwBytesWrite;
char chBuf[50], chEnvia[32], chEnvia2[3];
chBuf[0] = '\0';
double dPesada = 0;
char *cPuerto = getenv("CFPUERTO");
String ASPuerto = cPuerto;
hComm = CreateFile(ASPuerto.w_str(), GENERIC_READ | GENERIC_WRITE, 0, 0,
OPEN_EXISTING, 0, 0);
if(hComm == INVALID_HANDLE_VALUE)
{
ShowMessage("Error abiendo el puerto de comunicaciones");
return 0;
}
ctmoNew.ReadTotalTimeoutConstant = 100;
ctmoNew.ReadTotalTimeoutMultiplier = 0;
ctmoNew.WriteTotalTimeoutConstant = 100;
ctmoNew.WriteTotalTimeoutMultiplier = 0;
SetCommTimeouts(hComm, &ctmoNew);
dcbCommPort.DCBlength = sizeof(dcbCommPort);
GetCommState(hComm, &dcbCommPort);
BuildCommDCB(L"9600,o,7,1", &dcbCommPort);
SetCommState(hComm, &dcbCommPort);
char cRedondeo[25], chPeso[10];
sprintf(cRedondeo, "%06.f", Form1->PN(EPVP->Text) * 100);
unsigned int ui;
for(ui=0;ui<strlen(cRedondeo);ui++)
chEnvia[ui+5] = cRedondeo[ui];
sprintf(cRedondeo, "%13s", ENomArticulo->Text.c_str());
for(ui=0;ui<strlen(cRedondeo);ui++)
chEnvia[ui+17] = cRedondeo[ui];
chEnvia[0] = '\x04';
chEnvia[1] = '\x02';
chEnvia[2] = '0';
chEnvia[3] = '5';
chEnvia[4] = '\x1b';
chEnvia[11] = '\x1b';
chEnvia[12] = '0';
chEnvia[13] = '0';
chEnvia[14] = '0';
chEnvia[15] = '0';
chEnvia[16] = '\x1b';
chEnvia[30] = '\x03';
chEnvia[31] = '\0';
WriteFile(hComm, chEnvia, strlen(chEnvia), &dwBytesWrite, NULL);
ReadFile(hComm, chBuf, 45, &dwBytesRead, NULL);
if(dwBytesRead == 1)
{
if(chBuf[0] == '\x06')
{
chEnvia2[0] = '\04';
chEnvia2[1] = '\05';
chEnvia2[2] = '\0';
Sleep(500);
WriteFile(hComm, chEnvia2, strlen(chEnvia2), &dwBytesWrite, NULL);
Sleep(500);
ReadFile(hComm, chBuf, 45, &dwBytesRead, NULL);
if(dwBytesRead == 26)
{
if(chBuf[0] == '\x02')
{
chPeso[0] = chBuf[6];
chPeso[1] = chBuf[7];
chPeso[2] = chBuf[8];
chPeso[3] = chBuf[9];
chPeso[4] = chBuf[10];
chPeso[5] = '\0';
cRedondeo[0] = chPeso[0];
cRedondeo[1] = chPeso[1];
cRedondeo[2] = '.';
cRedondeo[3] = chPeso[2];
cRedondeo[4] = chPeso[3];
cRedondeo[5] = chPeso[4];
cRedondeo[6] = '\0';
try { dPesada = atof(cRedondeo); }
catch (...) { dPesada = 0; }
}
else
ShowMessage("Error en la lectura de la cabecera de la pesa");
}
else
ShowMessage("Error en los dígitos devueltos de la pesa");
}
else
ShowMessage("No se recibe ACK de la pesa");
}
else
ShowMessage("No se recibe respuesta de la pesa");
PurgeComm(hComm, PURGE_RXABORT);
CloseHandle(hComm);
|