Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: txenfsm en 8 Mayo 2012, 12:53 pm



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