Чтение входящих sms

Пишу скрипт чтения входящих sms, нужно для запроса баланса. Обнаружил, что сообщения прочитываются с ошибками, пропускаются отдельные символы в unicode-hex строке. Думал у меня руки кривые, запустился в minicom, 7 раз подряд прочитал одно и то же сообщение и каждый раз полученные строки отличаются. Вот лог миникома:

Press CTRL-A Z for help on special keys

at
OK
at+cscs=“gsm”
OK
at
OK
at+cmgf=1
OK
at+cmgr=17
+CMGR: “REC READ”,“w49702245656p696+656”,"",“17/05/04,22:44:10+12”
042304320430043604300435043C044B04390020041A043B04380435043D0442002100200412043004480438002004420435043A04430449043804350020044043004410445043E0434044B00200441043E04410442043004320438043B0438002001

OK
at+cmgr=17
+CMGR: “REC READ”,“w49702245656p696+656”,"",“17/05/04,22:44:10+12”
042304320430043604300435043C044B04390020041A043B04380435043D0442002100200412043004480438002004420435043A044304490438043500200440043004410445043E0434044B00200441043E04410442043004320438043B043800201

OK
at+cmgr=17
+CMGR: “REC READ”,“w49702245656p696+656”,"",“17/05/04,22:44:10+12”
042304320430043604300435043C044B0439002004A043B04380435043D0442002100200412043004480438002004420435043A044304490438043500200440043004410445043E0434044B00200441043E04410442043004320438043B0438002001

OK
at+cmgr=17
+CMGR: “REC READ”,“w49245656p696+656”,"",“17/05/04,22:44:10+12”
042304320430043604300435043C044B04390020041A043B04380435043D0002100200412043004480438002004420435043A044304490438043500200440043004410445043E0434044B00200441043E04410442043004320438043B043800200031

OK
at+cmgr=17
+CMGR: “REC READ”,“w49702245656p696+656”,"",“17/05/04,22:44:10+12”
042304320430043604300435043C044B04020041A043B04380435043D0442002100200412043004480438002004420435043A044304490438043500200440043004410445043E043404B00200441043E04410442043004320438043B0438002000331

OK
at+cmgr=17
+CMGR: “REC READ”,“w49702245656p696+656”,"",“17/05/04,22:44:10+12”
042304320430043604300435043C044B04390020041A043B04380435043D0442002100200412043004480438002004420435043A044304490438043500200440043004410445043E0434044B00200441043E04410442043004320438043B043800201

OK
at+cmgr=17
+CMGR: “REC READ”,“w49702245656p696+656”,"",“17/05/04,22:44:10+12”
042304320430043604300435043C044B04390020041A043B04380435043D0442002100200412043004480438002004420435043A044304490438043500200440043004410445043E0434044B00200441043E04410442043004320438043B043800201

OK

CTRL-A Z for help |115200 8N1 | NOR | Minicom 2.6.1 | VT102 | Offline

Действительно, пропускаются символы и из за этого весь остаток строки кривой и не читается.
С чем это может быть связано и как лечить ?

Владимир, добрый день!

Правильно ли я понял, что вы уже пользовались для чтения СМС способами из http://contactless.ru/wiki/index.php/GSM/GPRS, и у вас возникали ошибки?
(в частности:

$ gammu geteachsms # вывести все SMS
$ gammu getussd ‘#100#’ # запросить баланс на МТС в транслите

)

Если проблема действительно в общении модема и процессора по UART, то можете попробовать снизить скорость AT командой, например, до 9600.
Ещё напишите, пожалуйста, версию контроллера и название GSM модуля.

Добрый день!
Да, я пробовал через gammu и были ошибки, вот один из результатов запроса:

Location 1, folder “Inbox”, SIM memory, Inbox folder
SMS message
SMSC number : “+79037011111”
Sent : Fri Apr 28 20:32:06 2017 +0300
Coding : Unicode (no compression)
Remote number : “My Beeline”
Status : Read
User Data Header : Concatenated (linked) message, ID (8 bit) 210, part 1 of 3

??? !!! ??? ??? ??? ??? 350.00 ???. ???

Location 2, folder “Inbox”, SIM memory, Inbox folder
SMS message
SMSC number : “+79037011111”
Sent : Wed Jul 20 16:49:46 2016 +0300
Coding : Unicode (no compression)
Remote number : “Beeline”
Status : Read
User Data Header : Concatenated (linked) message, ID (16 bit) 52609, part 2 of 4

??? ??? ???. ??? ??? ??? ?? ??? ?

Unknown error.

Поэтому стал пробовать AT команды.
Сим карта сейчас билайновская, и шлет на #102# также как и на *102# - русские символы.
Контроллер wb5.3 , gsm модуль название где посмотреть через консоль? у меня контроллер на работе удаленно. Со скоростью буду пробовать.
Еще мысль возникла -у меня на этом же контроллере стоит GPS/GLONASS модуль с датчиком, опрашивается ntpd примерно раз в 5с, это не может влиять на ошибки ?

Действительно на скорости 9600 смс считываются нормально.
Возник другой вопрос -как грамотно из bash скрипта установить скорость 9600 и затем вернуть ее обратно ?

У меня AT-командой (echo -e “AT+IPR=9600\r\n” > $PORT) не получилось, не работает, при запросе смс выдает Fail
Получилось вот так:
stty -F $PORT 9600 -icrnl
но срабатывает почему то только на второй раз.

И еще-это косяк конкретной железки? или лучше везде читать смс на 9600 ?

Это не нормальное поведение, хорошо бы выяснить причины.

Теоретически влиять может. Попробуйте пожалуйста отключить и провероить, изменится ли что нибудь на 115200.

Ещё можно попробовать временно остановить обмен по RS-485, если есть, и тоже проверить. Только желательно делать по одному изменению за раз.

Чтобы изменить скорость, вам нужно сообщить новые настройки и модему, и контроллеру. Сначала меняете скорость на стороне модема командой AT+IPR на старой скорости. После этого переводите контроллер тоже на новую скорость с помощью stty.

Опять же, это борьба с симптомами.

Проблема локализовалась, выключил ntp сервис(который опрашивал glonass/gps модуль), сам модуль пока не вынимал, стали норм читаться смс на скорости 115200.

А обмен с GPS у вас на скорости 9600 идёт?

Какая версия ядра (вывод uname -a)

Версия ядра:
root@wbAZV5TSFJ:~# uname -a
Linux wbAZV5TSFJ 4.1.15-imxv5-x0.1 #211 Thu Nov 17 21:49:24 MSK 2016 armv5tejl GNU/Linux

обмен с gps как раз на 9600 и идет, я там скорость не менял

root@wbAZV5TSFJ:~# stty -F /dev/ttyAPP2
speed 9600 baud; line = 0;
intr = ; quit = ; erase = ; kill = ; eof = ; start = ; stop = ;
susp = ; rprnt = ; werase = ; lnext = ; flush = ;
ignbrk -brkint -imaxbel
-opost -onlcr
-isig -iexten -echo -echoe -echok -echoctl -echoke