Есть ли способ поймать ответ SIM800L после отправки команды at?
Я использую sim 800l с arduino. Я успешно посылаю AT-команду из arduino, а не в последовательный монитор, но я не могу поймать ответ после каждого успешного выполнения команды, если это нормально или нет. Я хочу сделать это, потому что, если есть ошибка в определенной команде, следующая команда не будет выполнена, если она не будет успешной. Не могли бы вы сказать мне, есть ли какой-нибудь способ сделать это?
@Angkon, 👍2
Обсуждение1 ответ
для последовательного чтения опроса я использую следующий метод :
bool tSim8_sendCommand(uint8_t sim_cmd[])
{
uint8_t simOK[2] = {0}, i=20;
tSoftSerial1_write(sim_cmd);
tSoftSerial1_write("\r\n");
while (i--)
{
simOK[0] = simOK[1];
simOK[1] = tSoftSerial1_readChar();
if(simOK[0] == 'O' || simOK[1] =='K')
{
return true;
}
}
return false;
}
переменная i
i цикл while используется только для повторных попыток, чтобы программа не попала в бесконечный цикл. этот код не требует пояснений. входящие символы "помещаются" в массив, пока массив не прочитает "ОК".
для неблокирующего это немного сложно, так как вам нужно определить машины состояний и циклы параллелизма. вот метод, который я использую для выяснения, была ли последняя передача в порядке:
void tsim_phase_ok_routine(uint8_t inChar)
{
if(tsim_aux_buff[0] == 'O' && tsim_aux_buff[1] =='K' && tsim_aux_buff[2] =='\r')
{
tsim_status_flag |= (1<<PHASE_OK);
tsim_status_flag &=~(1<<PHASE_CON_ERR);
return;
}
else
{
tsim_aux_buff[0] = tsim_aux_buff[1];
tsim_aux_buff[1] = tsim_aux_buff[2];
tsim_aux_buff[2] = inChar;
err_timeout--;
}
if(!(tsim_status_flag & (1<<PHASE_OK)) && !err_timeout)
{
tsim_status_flag &=~(1<<PHASE_OK);
tsim_status_flag |= (1<<PHASE_CON_ERR);
}
}
Я определяю "ФАЗЫ", чтобы выяснить, в какой фазе находится sim800. вся функция будет записана в подпрограмме обслуживания прерываний RX, и в нее будет передан входной символ.
что такое tSoftSerial1_readChar?, @Juraj
@Juraj это был программный последовательный обработчик для чтения символов, @Tirdad Sadri Nejad
вы знаете функции readBytesUntil? https://www.arduino.cc/reference/en/language/functions/communication/stream/streamreadbytesuntil/, @Juraj
@Juraj на самом деле, код, который я написал, написан на C99, поэтому я могу использовать его на любой платформе. Я по ссылке, да это делает ту же работу, @Tirdad Sadri Nejad
и почему вы путаете с ним новичка?, @Juraj
@Juraj в любом случае это ответ. вот почему на многие вопросы здесь есть несколько ответов. найдутся люди, которые просто зададут один и тот же вопрос в Google и могут быть или не быть новичками или использовать точную платформу. и мой ответ-чистый C, поэтому его можно использовать на arduino "как есть" и многих других платформах. мы также не можем сделать вывод, что ОП новичок, потому что он не знал об этом методе., @Tirdad Sadri Nejad
- Как настроить модуль TinySine 3G (SIM5320E) для запроса HTTP GET
- Проблема с получением SMS - GSM-модуль Arduino Uno и SIM900A
- Мини-модем SIM900a, IMEI 0, помощь с контактами TX RX
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- SIM800L не регистрируется в сети
- Как проверить, работает ли GSM-модуль?
- Как отправлять сообщения на несколько номеров с помощью модуля Arduino uno и SIM800?
используйте readBytesUntil, @Juraj
Читать Ник Гэммон [Как обрабатывать входящие последовательные данные без блокировки](http://gammon.com.au/serial). Как только вы поймете это, вы сможете построить свой собственный парсер., @hcheung