Прием по Serial и delay
- Войдите на сайт для отправки комментариев
Втр, 19/01/2021 - 11:40
Здравствуйте.
Работаю с 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..
У вас тут несколько странных действий в коде... задержка 5 сек в строке 5 бесполезна, потому что пока вы держите ресет модуля - он не перезагрузится.
Процедура
sim800_wait_answer();
несмотря на название - на самом деле ничего не ждет. Если ответа от модема нет - программа проскакивает процедуру без остановки.
В итоге вы реально начинаете читать сообщения от модема только после команды ATi и получаете лог запуска модема - как написан код, так он и работает
Спасибо вам.