configurar puerto com en c

Iniciado por txenfsm, 8 Mayo 2012, 12:53 PM

0 Miembros y 1 Visitante están viendo este tema.

txenfsm

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.

Eternal Idol

Usa GetLastError para ver cual es el error.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

txenfsm

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

txenfsm

#3
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