Проблемы с модулем GSM IOT-GA6
- Войдите на сайт для отправки комментариев
Втр, 21/05/2019 - 20:30
Здравствуйте, очень нужна помощь.
Купил GSM модуль на GA6 mini (https://arduino.ua/prod2346-gsm-modyl-na-ga6-mini)
Подключил к arduino UNO по UART через SoftwareSerial. Вроде все работает, но когда хочу вывести полученное сообщение (AT+CMGR=2), получаю вот такой вывод: +CMGR: "REC READ","?p9?81w162#83p++53",,"2018/09/07,16:42:41+03"079 6S0G2wb (номер телефона и сообщение или зашифрованы или это просто мусор)
Это проблема с модулем или может я не правильно получаю данные?
По настройках модуля:
скорость: 9600 бод
AT+CMGF=1 - режим кодировки SMS
AT+CSCS="GSM" -- режим кодировки текста
Зарание спасибо.
loop():
void loop() { int ch = 0; String val = ""; if (mySerial.available()) { //если GSM модуль что-то послал нам, то while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += (char)ch; delay(10); } Serial.println(val); //печатаем в монитор порта пришедшую строку val = ""; } if (Serial.available()) { //если в мониторе порта ввели что-то while (Serial.available()) { //сохраняем строку в переменную val ch = Serial.read(); val += char(ch); delay(10); } mySerial.println(val); val = ""; } }
1. Поставьте больше скорость сериалов
2. Уберите делеи
3. Уберите стринги. Передавайте данные между сериалами побпйтно ( read() -> write() )
зы. очень рекомендую забыть вообще про String (штатные С - функции не менее мощный инструмент, а после некоторого опыта использования даже более удобный) и delay() (если нужно выждать, правильней ждать СОБЫТИЯ, или истечения ТАЙМАУТА а не тормозить код на фиксированное время). Кстати delay() отключает прерывания, которые используются при чтении из порта.
Snip4ik - сообщения СМС закодированы т.н. 7-битным ASCII, их надо декодировать
Кстати delay() отключает прерывания, которые используются при чтении из порта.
нет, на прерывания delay не влияет
Спасибо за совет, скорость оставил 9600, потом сделал
и начало выводить адекватно. Но все же поиск по ключевых словах мне нужен, при попытке записать в строку, в сериал выводит все отлично, а в строку записывает криво (то нормально, то через символ). Пока что решил при помощи делея в 1 мсек, но похоже прийдеться прейти к масиву char
нет, на прерывания delay не влияет
Откуда дровишки? Я как то склонен доверять автору этого поста
http://arduino.ru/forum/programmirovanie/vzaimodeistvie-preryvanii-s-del...
нет, на прерывания delay не влияет
Откуда дровишки? Я как то склонен доверять автору этого поста
http://arduino.ru/forum/programmirovanie/vzaimodeistvie-preryvanii-s-del...
Если совсем строго подходить к вопросу, то на прерывания "влияют" вообще все выполняемые микропроцессором действия. В любом случае прерывание будет задержано до окончания выполнения текущей инструкции.
Откуда дровишки? Я как то склонен доверять автору этого поста
http://arduino.ru/forum/programmirovanie/vzaimodeistvie-preryvanii-s-delay-i-mezhdu-soboi#comment-129721
ну вы там дискуссию дальше почитайте - вы ее просто неправильно поняли, похоже.
delay внутри себя в цикле вызывает millis() или micros() которые запрещают прерывания. Но прерывания запрещаются на очень короткое время и потом разрешаются до следующего вызова. В промежутках между вызовами (а это большая часть времени выполнения оператора delay()) - прерывания разрешены.
А лучше, как говорит ЕвгенийП - возьмите да попробуйте. Напишите простейнький обработчик нажатия кнопки по прерыванию, пусть он при срабатывании зажигает встроенный диод ардуины. В луп вставьте хороший такой delay - на минуту или две, чтоб гарантировано перекрыть доступ к прерываниям :)
Если напишете правильно - при нажатии на кнопку светодиод должен загорется, несмотря на делей
Появилась ещё одна проблема, на сей раз с USSD запросами. Пытаюсь получить баланс при помощи команды AT+CUSD=1,"*111#",15 На что получаю либо что-то закодированое, либо просто мусор
+CUSD: 1, "⸮0;잃j⸮X⸮⸮⸮]
⸮J⸮⸮⸮⸮I}Z⸮O⸮>⸮~⸮⸮⸮p⸮^⸮⸮⸮v⸮A⸮9=
A⸮d⸮9
w⸮⸮⸮(⸮P⸮\⸮⸮Z" ,15
Кодировку переключить для СМС и УССД запросов. Как? Даташит почитать. Много инфы тут http://arduino.ru/forum/apparatnye-voprosy/modul-goouuu-tech-iot-ga6-krakozyabry-v-monitore-porta
Вот, к примеру AT+CSCS="GSM"
https://wiki.ai-thinker.com/_media/gprs/b000at00a0_gprs_series_module_at_instruction_set_v1.0.pdf
39-я страница
Кодировку переключал, так же пробовал и в HEX, потом при переводе в текст получаеться все тот же результат. Я даташит читал в первую очередь, на форумах так же смотрел, но похожей проблемы не встречал.
В промежутках между вызовами (а это большая часть времени выполнения оператора delay()) - прерывания разрешены.
Вероятность того что нажимая на кнопку я буду попадать на бОльший период когда прерывания разрешены конечно больше, и "потыкав кнопку" раз 10, 20 100 может ни одного пропуска не поймаю. Но я бы не надеялся что прерывание от сериал всегда будет приходить исключительно в этот бОльший период.
Вероятность того что нажимая на кнопку я буду попадать на бОльший период когда прерывания разрешены конечно больше, и "потыкав кнопку" раз 10, 20 100 может ни одного пропуска не поймаю. Но я бы не надеялся что прерывание от сериал всегда будет приходить исключительно в этот бОльший период.
когда одно прерывание попадает на другое - оно не "сгорает", а становится в очередь. Дальше сами догадаетесь. думаю