Не удается записать в модуль GSM через последовательное соединение с платы ARM.

В нашем выпускном проекте мы должны подключить 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

а затем он блокируется и остается бездействующим.

Если нам удастся перехватить сообщение «Готово», не означает ли это, что «чтение» работает нормально? и если выше напечатано «написано», не означает ли это, что «запись» работает нормально? Итак, почему мы не можем связаться с модулем?

Спасибо.


person ElOrabi    schedule 12.06.2012    source источник
comment
tcflush, мягко говоря, разрушительно. Мне трудно понять, почему вы хотите отбросить данные, поступающие от модуля GSM. Предполагать, что это сработает, кажется немного смелым.   -  person HonkyTonk    schedule 13.06.2012
comment
Я раньше не работал с модемами AT, но я только что бегло просмотрел стандарт - мне кажется, что вы не должны получать какой-либо ответ при отправке только AT - работает ли это в Hyperterminal? Вы пробовали другие команды?   -  person sonicwave    schedule 29.06.2012


Ответы (1)


вы смогли получить «Готово», потому что модемы отправляют это сообщение без какой-либо команды. Но вы начинаете выдавать команды ATM, которые вам нужны, чтобы получить ответ немедленно, без каких-либо задержек, потому что модем немедленно возвращается обратно, как только вы выдаете команду. Здесь вам нужно запустить два приложения: одно — выдавать команды, а второе — получать ответ. Или вы можете использовать прерывание по таймеру или чтение ответа последовательного порта.

person Nitin Gupta    schedule 29.06.2012
comment
Это просто ложь. Linux буферизует это для вас. Запускать два приложения — это просто плохая идея. - person Kristof Provost; 29.06.2012
comment
Согласен с Кристофом. Я написал множество приложений с последовательным протоколом, и у меня никогда не было проблем с выполнением всего в одном потоке (или, ну, в любом случае, никаких проблем, которые можно было бы исправить с помощью того, что предлагается в ответе). - person sonicwave; 29.06.2012
comment
Запуск двух приложений на одном ПК или плате не предлагается. На самом деле, это просто проверить, правильно ли получен ответ rcvd или нет. Таким образом, пользователю необходимо выполнить cmds из другого приложения и получить ответ от другого приложения, чтобы можно было четко определить, где проблема. - person Nitin Gupta; 02.07.2012