Проблемы с модулем GSM IOT-GA6

Snip4ik
Offline
Зарегистрирован: 21.05.2019

Здравствуйте, очень нужна помощь.
Купил 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 = "";
 }
}

 

vlad072
Offline
Зарегистрирован: 01.08.2017

1. Поставьте больше скорость сериалов

2. Уберите делеи

3. Уберите стринги. Передавайте данные между сериалами побпйтно ( read() -> write() )

зы. очень рекомендую забыть вообще про String (штатные С - функции не менее мощный инструмент, а после некоторого опыта использования даже более удобный) и delay() (если нужно выждать, правильней ждать СОБЫТИЯ, или истечения ТАЙМАУТА а не тормозить код на фиксированное время). Кстати delay() отключает прерывания, которые используются при чтении из порта.

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

Snip4ik - сообщения СМС закодированы т.н. 7-битным ASCII, их надо декодировать

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

vlad072 пишет:

 Кстати delay() отключает прерывания, которые используются при чтении из порта.

нет, на прерывания delay не влияет

Snip4ik
Offline
Зарегистрирован: 21.05.2019

Спасибо за совет, скорость оставил 9600, потом сделал

loop() {
  if (mySerial.available())
   Serial.write(mySerial.read());
}

и начало выводить адекватно. Но все же поиск по ключевых словах мне нужен, при попытке записать в строку, в сериал выводит все отлично, а в строку записывает криво (то нормально, то через символ). Пока что решил при помощи делея в 1 мсек, но похоже прийдеться прейти к масиву char

vlad072
Offline
Зарегистрирован: 01.08.2017

b707 пишет:

нет, на прерывания delay не влияет

Откуда дровишки? Я как то склонен доверять автору этого поста

http://arduino.ru/forum/programmirovanie/vzaimodeistvie-preryvanii-s-del...

sadman41
Offline
Зарегистрирован: 19.10.2016

vlad072 пишет:

b707 пишет:

нет, на прерывания delay не влияет

Откуда дровишки? Я как то склонен доверять автору этого поста

http://arduino.ru/forum/programmirovanie/vzaimodeistvie-preryvanii-s-del...

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

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

vlad072 пишет:

Откуда дровишки? Я как то склонен доверять автору этого поста

http://arduino.ru/forum/programmirovanie/vzaimodeistvie-preryvanii-s-delay-i-mezhdu-soboi#comment-129721

ну вы там дискуссию дальше почитайте - вы ее просто неправильно поняли, похоже.

delay внутри себя в цикле вызывает millis() или micros() которые запрещают прерывания. Но прерывания запрещаются на очень короткое время и потом разрешаются до следующего вызова. В промежутках между вызовами (а это большая часть времени выполнения оператора delay()) - прерывания разрешены.

А лучше, как говорит ЕвгенийП - возьмите да попробуйте. Напишите простейнький обработчик нажатия кнопки по прерыванию, пусть он при срабатывании зажигает встроенный диод ардуины. В луп вставьте хороший такой delay - на минуту или две, чтоб гарантировано перекрыть доступ к прерываниям :)

Если напишете правильно - при нажатии на кнопку светодиод должен загорется, несмотря на делей

Snip4ik
Offline
Зарегистрирован: 21.05.2019

Появилась ещё одна проблема, на сей раз с 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
 

kostyamat
Offline
Зарегистрирован: 16.11.2017

Кодировку переключить для СМС и УССД запросов. Как? Даташит почитать. Много инфы тут 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-я страница

Snip4ik
Offline
Зарегистрирован: 21.05.2019

Кодировку переключал, так же пробовал и в HEX, потом при переводе в текст получаеться все тот же результат. Я даташит читал в первую очередь, на форумах так же смотрел, но похожей проблемы не встречал.

vlad072
Offline
Зарегистрирован: 01.08.2017

b707 пишет:

В промежутках между вызовами (а это большая часть времени выполнения оператора delay()) - прерывания разрешены.

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

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

vlad072 пишет:

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

когда одно прерывание попадает на другое - оно не "сгорает", а становится в очередь. Дальше сами догадаетесь. думаю