Lectura de puerto serie en Win98/Me vs Win2000/NT/XP
hola chicos,
Tengo un programa que he hecho en C++ Builder 6 que lee datos de un osciloscopio Fluke por el puerto serie. El problema que tengo es que funciona muy bien sobre Win98/Me, pero me da errores de comunicaci贸n sobre Win2000/NT/XP (Valor ACK recibido del osciloscopio como: Error deconocido...). Que debo hacer para solucionarlo?.
El c贸digo fuente es el siguiente:
//Abrir Puerto
strcat(m_sComPort, PortCom); //Copy # -> Com = Com#
m_hCom = CreateFile(m_sComPort,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security
OPEN_EXISTING,
0, // no overlapped I/O
NULL); // null template
if(m_hCom == INVALID_HANDLE_VALUE)
{
Application->MessageBoxA("Error en el puerto","Puerto no disponible",0);
control=1;
return;
}
m_bPortReady = SetupComm(m_hCom, 128, 128); // set buffer sizes
/*CONFIGURACI脫N DEL PUERTO. Es especificado en Data Comunication Block
(DCB). Un f谩cil camino para inicializar un DCB es llamar a GetCommState,
para llenar sus valores por definici贸n, sobreescribe los valores que se
desean cambiar y entonces llama SetCommState para cambiar los valores.
*/
m_bPortReady = GetCommState(m_hCom, &m_dcb);
m_dcb.BaudRate=1200;
m_dcb.Parity=NOPARITY;
m_dcb.ByteSize=8;
m_dcb.StopBits = ONESTOPBIT;
m_dcb.fAbortOnError = TRUE;
m_bPortReady = SetCommState(m_hCom, &m_dcb);
if (m_bPortReady!=1)
{
ShowMessage("No fu茅 posible configurar el puerto");
CloseHandle(m_hCom);
control=1;
return;
}
//Communication timeouts are optional but can be set similarly to DCB values:
m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts);
m_CommTimeouts.ReadTotalTimeoutConstant = 100;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 0;
m_CommTimeouts.WriteTotalTimeoutConstant = 0;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 0;
m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
//VERIFICACI脫N DE COMUNICACI脫N Y CONFIGURANDO VELOCIDAD A 19200
bWriteRC = WriteFile(m_hCom, "PC",2,&iBytesWritten,NULL);
if (bWriteRC==0)
{
ShowMessage("Error al escribir en puerto");
control=1;
CloseHandle(m_hCom);
return;
}
WriteFile(m_hCom, "19200,N,8,1",11,&iBytesWritten,NULL);
WriteFile(m_hCom, "r",1,&iBytesWritten,NULL);
//VERIFICANDO PRIMERA COMUNICACI脫N Y CONFIGURACI脫N
bReadRC = ReadFile(m_hCom, &sBuffer[0], 1, &iBytesRead, NULL); //PROBLEMA----------------
if (bReadRC==0)
{
Application->MessageBox("Error al leer en puerto","Error",0);
control=1;
CloseHandle(m_hCom);
return;
}
ACK=sBuffer[0];
if (ACK!='0') //Verificaci贸n de comunicaci贸n con ScopeMeter (Fluke)
{
switch (ACK)
{
case '1':
ShowMessage("Error de sintaxis");
break;
case '2':
ShowMessage("Error de ejecuci贸n");
break;
case '3':
ShowMessage("Error de sincronizaci贸n");
break;
case '4':
ShowMessage("Error de comunicaci贸n");
break;
default:
ShowMessage("Error de comunicaci贸n desconocido!.n"
"- Verifique la conexi贸n al puerto serial,n"
"- Verifique que est茅 encendido el ScopeMeter.");
break;
}
CloseHandle(m_hCom);
control=1;
return;
}
Tengo un programa que he hecho en C++ Builder 6 que lee datos de un osciloscopio Fluke por el puerto serie. El problema que tengo es que funciona muy bien sobre Win98/Me, pero me da errores de comunicaci贸n sobre Win2000/NT/XP (Valor ACK recibido del osciloscopio como: Error deconocido...). Que debo hacer para solucionarlo?.
El c贸digo fuente es el siguiente:
//Abrir Puerto
strcat(m_sComPort, PortCom); //Copy # -> Com = Com#
m_hCom = CreateFile(m_sComPort,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security
OPEN_EXISTING,
0, // no overlapped I/O
NULL); // null template
if(m_hCom == INVALID_HANDLE_VALUE)
{
Application->MessageBoxA("Error en el puerto","Puerto no disponible",0);
control=1;
return;
}
m_bPortReady = SetupComm(m_hCom, 128, 128); // set buffer sizes
/*CONFIGURACI脫N DEL PUERTO. Es especificado en Data Comunication Block
(DCB). Un f谩cil camino para inicializar un DCB es llamar a GetCommState,
para llenar sus valores por definici贸n, sobreescribe los valores que se
desean cambiar y entonces llama SetCommState para cambiar los valores.
*/
m_bPortReady = GetCommState(m_hCom, &m_dcb);
m_dcb.BaudRate=1200;
m_dcb.Parity=NOPARITY;
m_dcb.ByteSize=8;
m_dcb.StopBits = ONESTOPBIT;
m_dcb.fAbortOnError = TRUE;
m_bPortReady = SetCommState(m_hCom, &m_dcb);
if (m_bPortReady!=1)
{
ShowMessage("No fu茅 posible configurar el puerto");
CloseHandle(m_hCom);
control=1;
return;
}
//Communication timeouts are optional but can be set similarly to DCB values:
m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts);
m_CommTimeouts.ReadTotalTimeoutConstant = 100;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 0;
m_CommTimeouts.WriteTotalTimeoutConstant = 0;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 0;
m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
//VERIFICACI脫N DE COMUNICACI脫N Y CONFIGURANDO VELOCIDAD A 19200
bWriteRC = WriteFile(m_hCom, "PC",2,&iBytesWritten,NULL);
if (bWriteRC==0)
{
ShowMessage("Error al escribir en puerto");
control=1;
CloseHandle(m_hCom);
return;
}
WriteFile(m_hCom, "19200,N,8,1",11,&iBytesWritten,NULL);
WriteFile(m_hCom, "r",1,&iBytesWritten,NULL);
//VERIFICANDO PRIMERA COMUNICACI脫N Y CONFIGURACI脫N
bReadRC = ReadFile(m_hCom, &sBuffer[0], 1, &iBytesRead, NULL); //PROBLEMA----------------
if (bReadRC==0)
{
Application->MessageBox("Error al leer en puerto","Error",0);
control=1;
CloseHandle(m_hCom);
return;
}
ACK=sBuffer[0];
if (ACK!='0') //Verificaci贸n de comunicaci贸n con ScopeMeter (Fluke)
{
switch (ACK)
{
case '1':
ShowMessage("Error de sintaxis");
break;
case '2':
ShowMessage("Error de ejecuci贸n");
break;
case '3':
ShowMessage("Error de sincronizaci贸n");
break;
case '4':
ShowMessage("Error de comunicaci贸n");
break;
default:
ShowMessage("Error de comunicaci贸n desconocido!.n"
"- Verifique la conexi贸n al puerto serial,n"
"- Verifique que est茅 encendido el ScopeMeter.");
break;
}
CloseHandle(m_hCom);
control=1;
return;
}
