Título: configurar puerto com en c Publicado por: txenfsm en 8 Mayo 2012, 12:53 pm 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. Título: Re: configurar puerto com en c Publicado por: Eternal Idol en 8 Mayo 2012, 17:22 pm Usa GetLastError para ver cual es el error.
Título: Re: configurar puerto com en c Publicado por: txenfsm en 8 Mayo 2012, 23:17 pm 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 Título: Re: configurar puerto com en c Publicado por: txenfsm en 9 Mayo 2012, 08:42 am 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 |