Перейти к содержанию
    

Привет всем!

 

Возникла у меня странная ситуация с SIM800.

Ожидаю смс вызовом в цикле AT+CMGR=1,0. Он мне возвращает OK пока смс не принят.

Посылаю смс на номер, после чего uart стоит по таймауту, буфер, естественно пустой.

Кто нибудь встречался с такой бедой? Таймаут 5 сек.

 

Да, и еще. Если смс отправить до того, как sim зарегистрировался в сети, то все

нормально отрабатывает. Получаем +CMGR: 1,...

 

Помогите люди добрые. Уже невмоготуууу...

 

Прошивка 1418B03SIM800C24

Uart на autoban(менял на фикс.скорость - не помогает)

Регистрируюсь в сети обычно.

AT+CFUN=1

AT+CSQ

AT+CPIN?

AT+CREG?

AT+CMGF=1

AT+CSCS="GSM"

AT+CPMS="SM"

 

M2M, МТС

Изменено пользователем an24

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чет так и не понял, в чем проблема и кто стоит.

Если уж совсем ничего не выходит, то все предположения проверяются в точке МОДУЛЬ-МК внешним UART, заведенным на компьютер.

И ничего не сказано об управлении потоком.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чет так и не понял, в чем проблема и кто стоит.

Если уж совсем ничего не выходит, то все предположения проверяются в точке МОДУЛЬ-МК внешним UART, заведенным на компьютер.

И ничего не сказано об управлении потоком.

 

Может не совсем понятно выразился. После приема смс из uart ничего не читается командой AT+CMGR=1,0. Также я пробовал и AT+СMGL.

Поведение аналогичное.

 

При отладке я вижу значения регистров UART, но я в них как-то слабо разбираюсь. Подскажите куда глядеть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала научитесь выражаться правильно. А то моя не понимать, что такое

После приема смс из uart ничего не читается командой AT+CMGR=1,0.

Ваши термины чужды мне.

Понимаете ли Вы сами себя?

 

Следующим этапом научитесь пользоваться переходником USB-UART, благо, высокоуровневый обмен данными с модулем можно написать и на большом компьютере.

А потом уже полученные знания (или готовый *.с файл) переносите в МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала научитесь выражаться правильно. А то моя не понимать, что такое

 

 

Способен ли кто-нибудь еще понять документ SIM800 Series AT Command Manual V1.05.pdf с

описанными там AT командами, которые я отправляю с МК STM32 на SIM800 по UARTу?

 

Вроде что может быть проще. Отправил команду AT+CMGR=1,0 с помощью функции HAL_UART_Transmit

 

static int8_t sendATcommandAndReadDataWithSendTimeOut(char* commandAT, void* response,
        uint16_t buffLen, uint32_t sendtimeout,uint32_t rtimeout) {
    HAL_StatusTypeDef r;

    HAL_Delay(10);

    UartHandle.State = HAL_UART_STATE_READY;
    r = HAL_UART_Transmit(&UartHandle, (uint8_t*) commandAT, strlen(commandAT),
            sendtimeout);
    if (r != HAL_OK) {
        return 0;
    }

    UartHandle.State = HAL_UART_STATE_READY;
    r = HAL_UART_Receive(&UartHandle, response, buffLen, rtimeout);
    if (r == HAL_ERROR) {
        return 0;
    };

    return 1;
}

 

а HAL_UART_Receive как раз должна мне вернуть

 

+CMGR: 1 .... тут дата,время, отправитель, текст смс
OK

 

если смс в наличии. И она это делает, если смс был принят SIM800 ранее.

Если смс не было то HAL_UART_Receive мне возвращает

 

+CMGR:
OK

 

И так в цикле я опрашиваю и жду смс. Тут она приходит и мне UART

ничего не возвращает. Ни HAL_ERROR ни HAL_BUSY ни HAL_OK. Таймаут

в функции HAL_UART_Receive истекает и я вижу просто пустой буфер.

 

Функции HAL_UART_**** из stm32l0xx_hal_uart.h. Копирайт STMicroelectronics.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не придумывать для себя проблемы с UART, наверное стоит изучить как работают AT команды.

Начать желательно не с руководста по командам для конкретного модуля, ибо оно уже предполагает, что пользователь знаком с предметом.

А начать со стандартов где это более подробно описано. Иначе это будет попытка написать роман не прочитав букварь.

Желательно под рукой иметь следующие стандарты

GSM 03.38.

GSM 03.40.

GSM 07.05.

GSM 07.07.

GSM 11.11.

 

И до написания на Си тоже рановато - отмоделируйте алгоритм в терминале - сначала вручную, потом макросом.

А уж когда все будет понятно, тогда к программе можно приступать. Иначе сами путаетесь и объяснить не можете.

 

И совет на будущее - не крутите циклы, изучите как работает CNMI

 

AT+CNMI Настройка формирования отчетов о событиях SMS.

"Команда AT+CNMI управляет настройками SMS, относящимися к представлению кодов URC.

По этой команде выбирается процедура индикации приема нового короткого сообщения для TE, если это устройство TE активно (например, сигнал DTR находится в состоянии ON).

Если TE неактивно (например, сигнал DTR находится в состоянии OFF), прием сообщения должен быть выполнен согласно спецификации 3GPP TS 23.038.

Если сигнал DTR отсутствует или его состояние игнорируется (команда AT&D0 V.250), то достоверная передача сообщения обеспечивается использованием процедуры подтверждения AT+CNMA......"

 

ну и так далее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не придумывать для себя проблемы с UART, наверное стоит изучить как работают AT команды.

 

И совет на будущее - не крутите циклы, изучите как работает CNMI

 

AT+CNMI Настройка формирования отчетов о событиях SMS.

"Команда AT+CNMI управляет настройками SMS, относящимися к представлению кодов URC.

По этой команде выбирается процедура индикации приема нового короткого сообщения для TE, если это устройство TE активно (например, сигнал DTR находится в состоянии ON).

Если TE неактивно (например, сигнал DTR находится в состоянии OFF), прием сообщения должен быть выполнен согласно спецификации 3GPP TS 23.038.

Если сигнал DTR отсутствует или его состояние игнорируется (команда AT&D0 V.250), то достоверная передача сообщения обеспечивается использованием процедуры подтверждения AT+CNMA......"

 

ну и так далее

 

Спасибо за ответ. Вам мой вопрос оказался понятен и это радует. Причину проблемы я нашел 20 минут назад самостоятельно. Оставлю решение здесь, так как вижу что здешние гуру в практике не очень сильны. Итак.

 

В SIM800 по умолчанию неожиданно выставлено AT+CNMI 2,1 что приводит к тому, что после первой любой команды чтения смс SIM в UART начинает гнать оповещения при приеме смс. Естественно, мой цикл чтения смс этого не ожидает и посылает в UART команду чтения AT+CMGR. Тут UARTу и наступает конец.

 

Решение простое. Если хотите получать смс методом опроса выполните перед циклом AT+CNMI=0. Если хотите методом оповещения, то после первого AT+CMGR переходите к циклу чтения из UART и ожидайте оттуда +CMT.

 

Всем успехов!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык тот кто знаком с принципом приема SMS, в первую очередь проверит и настроит кодовую страницу, вид сообщения (текст или PDU) и реакцию на его приход.

 

Ну а по поводу "неожиданно выставлено AT+CNMI 2,1" - где написано, оставляю поискать самим. Документацию нужно читать всю.

Слева для 800 серии, справа для 900 серии.

post-7988-1463576318_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык тот кто знаком с принципом приема SMS, в первую очередь проверит и настроит кодовую страницу, вид сообщения (текст или PDU) и реакцию на его приход.

 

Ну а по поводу "неожиданно выставлено AT+CNMI 2,1" - где написано, оставляю поискать самим. Документацию нужно читать всю.

Слева для 800 серии, справа для 900 серии.

 

Спасибо за док. Полезно. Но справедливости ради, скажу что весь интернет пестрит примерами приема смс от разных знающих людей.

И никто из них даже не упоминает, о том, что перед приемом нужно выставить AT+CNMI. Наверное потому что мало кто с SIM800 работает.

Ну да ладно. Еще раз спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>>>И никто из них даже не упоминает, о том, что перед приемом нужно выставить AT+CNMI.

 

Дело не в конкретном модуле. Мало кто хочет читать больше даташитов, да и те редко внимательно прочитывают.

На форуме (в этой тематике) дотошных инженеров ну десятка два наберется.

Да и не преподают у нас в вузах подобного - а самому нужно время и желание чтобы учиться и разбираться.

 

Поэтому часто такие перекосо-недосмотры и возникают.

Ошибиться не стыдно, не ошибается только тот, кто ничего не делает. Стыдно не желать развиваться и учиться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Естественно, мой цикл чтения смс этого не ожидает и посылает в UART команду чтения AT+CMGR.

Поэтому и существует совет забросить МК и освоить вначале терминал.

А потом написать на компьютере C файл, работающий с модемом. А всякие UART_Read и UART_Write опередлить на ReadFile и WriteFile. Отладка на компьютере в разы удобней.

 

Ваш цикл все равно никуда не годится, если он "зависает" на таких мелочах. От "RING" как спасаться будете? А он с очень большим успехом залезет там, где его не ждут.

 

И еще совет: научитесь выражать свои мысли правильно. Если Вы не можете сформулировать грамотно задачу, исполнить ее (написать программу) не получится.

После приема смс из uart ничего не читается командой AT+CMGR=1,0.

Приема SMS кем? /модулем, телефоном, базовой станцией/

Как можно из UART прочитать командой AT...? Из него можно вычитать ДАННЫЕ функцией чтения. А вот прочесть СМС из МОДУЛЯ (заставить его ВЫДАТЬ данные) можно подав ему команду.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш цикл все равно никуда не годится, если он "зависает" на таких мелочах. От "RING" как спасаться будете? А он с очень большим успехом залезет там, где его не ждут.

 

Бороться с другими URC планировал с помощью ATE0.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бороться с другими URC планировал с помощью ATE0.

Мда.... Тяжелый случай.

Советую все же начать с более глубокого изучения документации. А не чьих-то вредных советов в интернете.

И ни в коем разе не пишите сразу программу, чтобы потом ее всю не переписывать. Проверьте свои предположения в терминале.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бороться с другими URC планировал с помощью ATE0.

C URC не бороться, а пользоваться нужно, зачем всё выспрашивать, когда модуль автоматом выдаёт. Да и работать с модулем циклами ожидания ИМХО бред. Выкиньте ХАЛокуб от stm, напишите нормальный драйвер для USART с DMA и прерыванием по IDLE и будет счастье.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...