Доброго времени суток! При выполнении USSD запроса для получения номер сим карты я вижу, что некоторые символы приходят некорректно. Проблему наблюдаю исключительно на модуле sim800c (GPRS Shield v3). Модуль подключен к МК по software serial. Оператор - теле2. Сталкивался ли кто с подобной проблемой? Код (C++): void loop() { if (Serial.available() > 0) { // если приходят данные по USB while (Serial.available() > 0) { // записываем их в GPRS Shield Serial1.write(Serial.read()); } } if (Serial1.available() > 0) { // если приходят данные с GPRS Shield while (Serial1.available() > 0) { // передаём их в USB Serial.write(Serial1.read()); } } }
Ответы приходят в UCS2, это один из способов кодирования. Читайте про эту кодировку, и раскодируйте ответ. Что касается мусора - причин может быть много, начиная от банальных плохих контактов.
Кавычки в начале строки, в конце - " , 72 - говорят, что строка передается корректно. Думаю все таки кодировка не та.
Скорость 9600 ( в модуле настраивается автоматически). если речь о гео локализации - то РУ (домашний регион) я вообще не указываю кодировку (она разная в тексте ответа(0412043004480020...) и вспомогательной информации(+CUSD: 0)) Да и дело вряд ли в ней т.к. периодически приходят целые сообщения
В том и сложность, что не могу раскодировать, т.к. строка битая. Периодически перезагружая модуль удается добиться нормальной работы, но со следующим перезапуском снова такая же ерунда. Но так же иногда целые и битые ответы идут в перемешку (скрин) И как можно заметить на скрине 2 - ошибки идут в одних и тех же местах, так что думаю это не контакты
Причин - масса, начиная от плохих контактов, заканчивая длинными проводами, помехами по питанию, плохим питанием, нехваткой питания и т.д. и т.п. Для того, чтобы понять источники проблемы - одного скрина, увы, недостаточно - нужен системный анализ. А кроме вас - никто не знает, что и как там у вас соединено, как и чем питается, и т.д. и т.п.
Соединение элементарное (согласно инструкциям амперки (шилд сверху ардуинки и две перемычки на RX TX)) питание 12в (блок от ноута так что тока хватает точно). Грешу на неисправность самого модуля. Если решения не найду - попробую сменить его на шилде, но естественно делать этого не хотелось бы
Ну и плюс софтсериал. Там запрещения прерываний есть. Я бы попробовать скорость поднять. У меня на 9600 иногда сбоило, а на 38400 нормально работал. (на более короткое время прерывания запрещаются)
Попробовал, но толку ноль. Да и врятли дело в сериал соединении т.к. все остальные данные (смс, команды) доходят без проблем (смс кстати тоже в UCS2)
блин, я в замешательстве.. Это сработало! Спасибо за идею. Я уже почти пошел перепаивать модуль на другой)) Может быть есть мысли от чего так происходит?
Иногда программы - слишком себе на уме, и пытаются отобразить набор байт как какой-то символ. Видимо, в случае с штатным монитором порта - именно это и имеет место быть. Честная терминалка, пока её не попросишь специально - отображает вывод как есть.
Да, бывало такое. Я обычно TeraTerm пользуюсь, его на Японский перекидывает, но тут сразу понятно, что склинило...