Ver Mensaje Individual
  #5  
Antiguo 07-04-2022
chenech chenech is offline
Miembro
 
Registrado: dic 2013
Posts: 72
Reputación: 11
chenech Va por buen camino
API de Windows

Cita:
Empezado por chinchan Ver Mensaje
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);

Última edición por chenech fecha: 07-04-2022 a las 00:11:12.
Responder Con Cita