В нашем выпускном проекте мы должны подключить GSM-модуль (ADH8066) к нашей плате ARM (OK-6410), на которой работает Embedded Linux (Qtopia), и обмениваться данными с ней.
Когда мы впервые работаем с модулем, он отправляет сообщение «Готово», после чего мы можем общаться с ним через AT-команды. Мы успешно связались с ним с помощью Hyper-Terminal и смогли отправить простое SMS.
Проблема возникает, когда мы пытаемся связаться с ним с платы ARM.
Нам удается получить сообщение «Готово», но ответа нет.
Вот код, который мы разработали до сих пор:
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;
}
Ответ, который мы получили:
Hello GSM
Ready Found!
Written
а затем он блокируется и остается бездействующим.
Если нам удастся перехватить сообщение «Готово», не означает ли это, что «чтение» работает нормально? и если выше напечатано «написано», не означает ли это, что «запись» работает нормально? Итак, почему мы не можем связаться с модулем?
Спасибо.
tcflush
, мягко говоря, разрушительно. Мне трудно понять, почему вы хотите отбросить данные, поступающие от модуля GSM. Предполагать, что это сработает, кажется немного смелым. - person HonkyTonk   schedule 13.06.2012