Получить ответ AT команды

Я использую Arduino Uno с модулем sim900 gps/gprs, и я использую команды at, как я могу получить ответ команды at (т.е. OK, ERROR), чтобы я мог что-то сделать if response == "OK" или же response == "ERROR"

4 ответа

Решение

Вы можете использовать следующий код для считывания ответа от GSM-модуля SIM900 сразу после подачи AT-команды.

char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
   response[i++] = Serial.read();
}

После прочтения ответа вы можете использовать strstr() функция, чтобы проверить, является ли это "ОК" или "ОШИБКА", как указано ниже:

if(strstr(responce, "OK"){
   /*Do your code to handle OK response*/
}
else if(strstr(responce, "ERROR"){
   /*Do your code to handle ERROR response*/
}
else {
   /* You got some other response*/
}

Если вы еще не прочитали всю главу 5 спецификации V.250, прекратите чтение здесь и сделайте это немедленно, это важная основа для остальной части этого ответа, я подожду, пока вы не вернетесь. Некоторые из ссылок на алфавиты (короткая версия: игнорируйте это / рассматривайте это как ASCII) и S-регистры могут показаться загадочными, но не сдавайтесь, они быстро вырастут.


Единственный правильный способ обработки выходных данных модема - разделить выходные данные на целые строки и выполнить итерацию по одной полной строке за раз. Это универсально и применимо к абсолютно всем AT-командам (с одним единственным исключением, которое я могу придумать1).

Позвольте мне подчеркнуть следующее: вы должны разбивать текст ответа модема только на строгих границах конца строки ("\r\n"), и обработать полученную строку строки за одну операцию. Так что вы действительно должны пойти и реализовать read_line_from_modem Функция, которую я предложил в моем предыдущем ответе.

Это означает, что всякий раз, когда вы хотите проверить OK код результата, который вы должны использовать только strcmp(line, "OK\r\n") а не strstr или аналогичный, потому что вы знаете, что обрабатываете полную, полную строку, которая должна начинаться с кода окончательного результата в самом начале, и за ним всегда будет следовать "\r\n"2

Теперь есть более окончательные коды результатов, чем просто OK а также ERRORи вместо того, чтобы пытаться все выяснить самостоятельно3, я предлагаю взглянуть на is_final_result_code или isFinalResponseSuccess, как указано в этом ответе.

Резюме

  1. Всегда читайте выходные данные модема построчно, и используйте отдельную функцию для чтения, возвращая / изменяя строку / буфер для хранения строки.
  2. Первое, что вы должны сделать после прочтения строки, это проверить, является ли это конечный код результата. Напишите отдельную функцию, которая принимает строку в качестве параметра и проверяет, есть ли она.
  3. Если строка не была окончательным кодом результата, делайте все, что подходит для выполняемой (ых) AT-команды.
  4. Прочитайте следующую строку и вернитесь к 2.

1"\r\n> " префикс для AT+CMGS это единственное место, где вы делаете что-то немного другое, то есть начинаете обрабатывать ответ модема на чем-то отличном от строгой границы линии.

2 Если вы не настроили неправильно S3 а также S4 что вы никогда не должны делать.

3 Список в V.250 не является полным, существует пара, более определенная в 27.005 и 27.007.

Я просто хотел добавить, что ответ KHAJAS помог мне, но я должен был изменить его, чтобы он работал так:

char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
    response[i] = Serial.read();
}

Принимая во внимание, что его ответ был [i++], поэтому он увеличивал i в цикле for, а затем снова увеличивал i при сохранении этого символа в индексе ответа i.

Вам нужно прочитать ответ от последовательного соединения, что вы говорите с модулем, что-то вроде:

String getResponse() {
    String response = "";
    while(mySerial.available()!=0){
        response += mySerial.read();
    }
    return response;
}

(mySerial относится к последовательному порту, который вы используете с модулем, если вы просто используете обычный последовательный порт на контактах 0 и 1, то вы должны заменить его на Serial)

Вы, вероятно, захотите обрезать любые пробельные символы в начале и конце, используя response.trim() перед проверкой, чтобы увидеть, равен ли он одному из ответов, которые вы ищете.

Другие вопросы по тегам