Прием по Serial и delay

skilful
Offline
Зарегистрирован: 18.01.2021

Здравствуйте.

Работаю с sim800. Делаю ему reset и принимаю от sim800 загрузочные сообщения. Принимаю аппаратным uart и шлю программным на компьютер.

Правильно я понимаю, что можно подождать секунд 5 после перезагрузки sim800 и считать, что там в буфер по прерыванию от аппаратного uart накидалось, а дальше слать команду sim800 ? Пишу такой код:

void sim800_connect(void) {

        sim800_reset_ddr |= (1 << sim800_reset);         //перезапуск sim800
        sim800_reset_port &= ~(1 << sim800_reset);    
        _delay_ms(5000);   
        sim800_reset_ddr &= ~(1 << sim800_reset);

        sim800_wait_answer();                            //ждем загрузки sim800 и читаем сообщения от него

        _delay_ms(5000);
        sim800_serial.println("ATI");                    //шлем команду для проверки
        sim800_wait_answer();
                                 
}


void sim800_wait_answer(void){
        while(sim800_serial.available() > 0) {
            debug_serial.write(sim800_serial.read());           
        }
 }

  
 
Однако наблюдаю, что sim800_serial.println("ATI"); не ждет никакие _delay_ms(5000); а сразу шлется модулю sim800. 
 
 
В итоге получаю в выводе от sim800, которые он дает при загрузке внезапный ответ от команды ATI.
 
Почему программная задержка как будто не работает и раньше времени отрабатывает посылка команды ATI?
 
 
000001	10:31:39.509	00	.
000002	10:31:44.529	0D 0A	..
000003	10:31:44.529	52 44 59 0D 0A	RDY..
000004	10:31:44.529	0D 0A	..
000005	10:31:44.529	2B 43 46 55 4E 3A 20 31 0D 0A	+CFUN: 1..
000006	10:31:44.529	0D 0A	..
000007	10:31:44.529	2B 43 50 49 4E 3A 20 52 45 41 44 59 0D 0A	+CPIN: READY..
000008	10:31:44.529	41 54 49 0D 0D 0A	ATI...
000009	10:31:44.529	53 49 4D 38 30 30 20 52 31 34 2E 31 38 0D 0A	SIM800 R14.18..
000010	10:31:44.529	0D 0A	..
000011	10:31:44.529	4F 4B 0D 0A	OK..

 

 
 
b707
Offline
Зарегистрирован: 26.05.2017

У вас тут несколько странных действий в коде... задержка 5 сек в строке 5 бесполезна, потому что пока вы держите ресет модуля - он не перезагрузится.

Процедура

sim800_wait_answer();

несмотря на название - на самом деле ничего не ждет. Если ответа от модема нет - программа проскакивает процедуру без остановки.

 

В итоге вы реально начинаете читать сообщения от модема только после команды ATi и получаете лог запуска модема - как написан код, так он и работает

skilful
Offline
Зарегистрирован: 18.01.2021

Спасибо вам.