Получить ответ 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, как указано в этом ответе.
Резюме
- Всегда читайте выходные данные модема построчно, и используйте отдельную функцию для чтения, возвращая / изменяя строку / буфер для хранения строки.
- Первое, что вы должны сделать после прочтения строки, это проверить, является ли это конечный код результата. Напишите отдельную функцию, которая принимает строку в качестве параметра и проверяет, есть ли она.
- Если строка не была окончательным кодом результата, делайте все, что подходит для выполняемой (ых) AT-команды.
- Прочитайте следующую строку и вернитесь к 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()
перед проверкой, чтобы увидеть, равен ли он одному из ответов, которые вы ищете.