Hola, estoy realizando una aplicacion en c que se comunica con un puerto com al cual esta conectado un moden, lo que intento es enviar mensajes mediante comandos at, todo funciona pero tengo una duda o un problema porque no se si esto debe ser asi siempre. Resulta que la aplicacion no guarda la configuracion del puerto es decir:
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams))
printf("\nSetCommState error!");
else{
printf("\nSetCommState ok.");
}
No lo realiza bien no se porque pero si configuro el puerto por hyperterminal y le doy estos mismos valores luego todo funciona a la perfeccion, no encuentro manera de solucionarlo creo que esta todo bien pero aun asi os dejo el codigo para que podais verlo mejor:
int abrir_puerto(){
int bandera=0;
char lineabaudio[30];
hSerial = CreateFile(puerto, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0,NULL);
if(hSerial!=INVALID_HANDLE_VALUE)
{
DCB dcbSerialParams;
if (!GetCommState(hSerial, &dcbSerialParams))
printf("\nGetCommState error!");
else
printf("\nGetCommState ok.");
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams))
printf("\nSetCommState error!");
else{
printf("\nSetCommState ok.");
}
}
else
bandera=1;
return bandera;
}
void comandos_inicio(){ //funcion que ejecuta los primeros comando necesarios para configurar el dispositivo
char *comando[4]={"AT \r","AT+CPIN? \r","AT+CMGF=1 \r","AT+CSCS=\"GSM\" \r"};
char szBuff[2024];
int i=0;
while(i<4){
strcpy(szBuff,comando);
if(!WriteFile(hSerial, szBuff,strlen(szBuff), &dwBytesRead, NULL)) //Escribe cada comando
printf("\nWriteFile error!");
else{
Sleep(waitsms);
dwBytesRead = 0;
if(!ReadFile(hSerial, szBuff, sizeof(szBuff), &dwBytesRead, NULL)) //lee la respuesta de cada comando
printf("\nReadFile error!");
else{
szBuff[dwBytesRead] = '\0';
printf(" ReadFile: %s\n", szBuff);
}
if(i==1)
if( strstr(szBuff,"READY")==NULL)
i=5;
i++;
}
}
}
Espero que me podais ayudar, gracias de antemano.
Usa GetLastError para ver cual es el error.
Hola gracias por contestar, no es que me de ningun error porque la aplicacion se conecta al puerto y añade la configuracion lo que pasa es que cuando escribe el comando at se queda esperando respuesta es decir la parte:
int abrir_puerto(){
int bandera=0;
char lineabaudio[30];
hSerial = CreateFile(puerto, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0,NULL);
if(hSerial!=INVALID_HANDLE_VALUE)
{
DCB dcbSerialParams;
if (!GetCommState(hSerial, &dcbSerialParams))
printf("\nGetCommState error!");
else
printf("\nGetCommState ok.");
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams))
printf("\nSetCommState error!");
else{
printf("\nSetCommState ok.");
}
}
else
bandera=1;
return bandera;
}
funciona se queda esperando cuando se escribe el comando at en:
void comandos_inicio(){ //funcion que ejecuta los primeros comando necesarios para configurar el dispositivo
char *comando[4]={"AT \r","AT+CPIN? \r","AT+CMGF=1 \r","AT+CSCS=\"GSM\" \r"};
char szBuff[2024];
int i=0;
while(i<4){
strcpy(szBuff,comando);
if(!WriteFile(hSerial, szBuff,strlen(szBuff), &dwBytesRead, NULL)) //Escribe cada comando
printf("\nWriteFile error!");
else{
Sleep(waitsms);
dwBytesRead = 0;
if(!ReadFile(hSerial, szBuff, sizeof(szBuff), &dwBytesRead, NULL)) //lee la respuesta de cada comando
printf("\nReadFile error!");
else{
szBuff[dwBytesRead] = '\0';
printf(" ReadFile: %s\n", szBuff);
}
if(i==1)
if( strstr(szBuff,"READY")==NULL)
i=5;
i++;
}
}
}
Y si configuro el puerto desde hyperterminal todo funciona bien, escribe y recibe respuesta de los comandos.
El dispositivo es un modem normal marca huawei no se si tiene que ver.
Un saludo
Hola de nuevo, he cambiado la forma de abrir el puerto por :
hSerial = CreateFile(puerto, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
y al escribir el comando at me da el error 87 con la funcion GetLastError (),y sin modificar nada es decir:
hSerial = CreateFile(puerto, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0,NULL);
el programa se queda esperando respuesta del comando at, ni idea de que es alguna ayuda.
Un saludo