Есть ли способ поймать ответ SIM800L после отправки команды at?

Я использую sim 800l с arduino. Я успешно посылаю AT-команду из arduino, а не в последовательный монитор, но я не могу поймать ответ после каждого успешного выполнения команды, если это нормально или нет. Я хочу сделать это, потому что, если есть ошибка в определенной команде, следующая команда не будет выполнена, если она не будет успешной. Не могли бы вы сказать мне, есть ли какой-нибудь способ сделать это?

, 👍2

Обсуждение

используйте readBytesUntil, @Juraj

Читать Ник Гэммон [Как обрабатывать входящие последовательные данные без блокировки](http://gammon.com.au/serial). Как только вы поймете это, вы сможете построить свой собственный парсер., @hcheung


1 ответ


-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