No se puede escribir en el módulo GSM a través de la conexión en serie desde la placa ARM

En nuestro proyecto de Graduación, se supone que debemos conectar un módulo GSM (ADH8066) a nuestra placa ARM (OK-6410) que ejecuta Embedded Linux (Qtopia) y comunicarnos con ella.

Cuando operamos por primera vez en el módulo, envía un mensaje de "Listo", luego podemos comunicarnos con él a través de comandos AT. Nos comunicamos con él con éxito usando Hyper-Terminal y logramos enviar un SMS simple.

El problema ocurre cuando intentamos comunicarnos con él desde la placa ARM.

Conseguimos recibir el mensaje de "Listo", pero luego no tenemos ninguna respuesta.

Aquí está el código que hemos desarrollado hasta ahora:

int main(void){

int fd;
char *dev ="/dev/ttySAC3";
struct termios options;

char buffer[20];
char buffer2[20];
char *bufptr;
char *bufptr2;
bufptr = buffer;
bufptr2 = buffer2;
int nbytes,nbytes2=0;

fd = open (dev, O_RDWR | O_NOCTTY);

tcflush(fd, TCIOFLUSH);

tcgetattr(fd, &options);

cfsetispeed(&options, B115200); //Set Baud-rate to 115200
cfsetospeed(&options, B115200);

options.c_cflag |= CLOCAL | CREAD; //Enable the receiver and set local mode
options.c_cflag &= ~PARENB; //No parity (8N1)
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS; //Disable hardware flow control

options.c_lflag |= (ICANON | ECHO | ECHOE); //enable input-canonical mode

options.c_iflag = IGNPAR; //Ignore parity errors
options.c_iflag &= ~(IXON | IXOFF | IXANY); //Disable software flow control

options.c_oflag |= OPOST; //enable output-processing mode

tcsetattr(fd, TCSANOW, &options);

printf("Hello GSM\n");

tcflush(fd, TCIOFLUSH);

//capture the "Ready" message
while(1){
    nbytes = read(fd, bufptr, 1);
    if (0!=strstr(buffer,"Ready")){
        printf("\nReady Found!\n");
        break;
    }
    bufptr += nbytes;
}

tcflush(fd, TCIOFLUSH);

// send simple "AT" AT command
int y = write(fd,"AT\r\n",4);
if (y==4)
    printf("Written\n");

//trying to capture the "OK" response for the above AT command
while(1){
    nbytes2 = read(fd, bufptr2, 1);
    perror ("Read error: ");
    printf("%c\n",*bufptr2);
}

return 1;
}

La respuesta que obtuvimos es:

Hello GSM

Ready Found!
Written

y luego se bloquea y permanece inactivo.

Si logramos capturar el mensaje "Listo", ¿no significa eso que "leer" está funcionando bien? y si "escrito" está impreso arriba, ¿no significa eso que "escribir" está funcionando bien? Entonces, ¿por qué no podemos comunicarnos con el módulo?

Gracias.

preguntado el 12 de junio de 12 a las 18:06

tcflush es, por decir lo menos, destructivo. Me cuesta entender por qué quieres descarte datos que provienen del módulo GSM. Asumir que esto funcionará parece un poco audaz. -

No he trabajado con módems AT antes, pero acabo de echar un vistazo rápido al estándar; para mí, no parece que se suponga que debes recibir ninguna respuesta cuando solo envías "AT". ¿Funciona esto en ¿Hiper terminal? ¿Has probado con otros comandos? -

1 Respuestas

pudo recibir "Listo" porque los módems envían este mensaje sin ningún comando. Pero comienza a emitir los comandos ATM que necesita para recibir la respuesta inmediatamente sin demora porque Modem vuelve inmediatamente tan pronto como emite el comando. Aquí debe ejecutar dos aplicaciones, una es emitir comandos y la segunda es recibir la respuesta. O puede usar la interrupción del temporizador o leer la respuesta del puerto serie.

Respondido el 29 de junio de 12 a las 13:06

Eso es falso. Linux almacenará esto por usted. Ejecutar dos aplicaciones es solo una mala idea. - Kristof Provost

De acuerdo con Kristoff. He escrito muchas aplicaciones de protocolo en serie y nunca he tenido ningún problema para hacer todo en un solo hilo (o bueno, no hay ningún problema que podría haberse solucionado con lo que se propone en la respuesta, de todos modos). - onda sónica

No se propone ejecutar dos aplicaciones en la misma PC o placa. De hecho, es solo para verificar si la respuesta se recibe correctamente o no. Por lo tanto, el usuario debe emitir cmds desde otra aplicación y recibir la respuesta de la otra aplicación para que pueda haber una clara distinción de dónde está el problema. - Nitin Gupta

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.