Разбор строки с GSM модема

Тема в разделе "Arduino & Shields", создана пользователем saniks, 6 окт 2013.

  1. saniks

    saniks Нуб

    С GSM модема читаю СМС, по serial ответ приходит в таком виде, записываю его в char[100]
    Подскажите как можно выделить и записать в новую переменную text sms?
     
  2. Unixon

    Unixon Оракул Модератор

    Вам по сути нужно написать синтаксический анализатор СМС. Это не очень сложно реализуется, но требует довольно долгого объяснения. Поскольку вам не нужно обрабатывать всю служебную информацию в этой строке, достаточно упрощенного правила разбора. Что-то вроде "если строка не начинается на AT или +CGMR или OK, то ее нужно добавить к text sms", но это очень грубо.

    Нужно определиться, что есть "text sms" из всего этого, почему любые другие части строки не могут быть признаны частью "text sms". Если вы покажете эту строчку человеку, который ни разу не видел модема с его AT-командами и не знает деталей работы GSM модуля, он, вероятно, не сможет определить где начинается и где заканчиватся "text sms". Вот микроконтроллер - это такая же штука, которая ничего об окружающем мире не знает и вы должны обяснить ему, почему, например, "2013/10/02 04:57:49+24" или "ОК" не являются частью СМСки.

    p.s. Символы перевода строк передаются или там просто сплошной текст?
     
  3. Unixon

    Unixon Оракул Модератор

    Крайне рекомендую обзавестись вот этой книгой, она вам во многом поможет разобраться.
     
  4. lerik2703

    lerik2703 Гик

    ну а если не хотеться сильно заморачиваться можно подключить библиотеку SIM900
     
    Последнее редактирование: 15 фев 2014
  5. lerik2703

    lerik2703 Гик

    единственно чтобы библиотека работала без лишних заморочек с этим модулем GPRS Shield v2 (эмуляция 7-8 контакты.) в файле GSM.cpp найти строки
    Код (Text):
    #define _GSM_TXPIN_ 2
    #define _GSM_RXPIN_ 3
    и заменить их на
    Код (Text):
    #define _GSM_TXPIN_ 7
    #define _GSM_RXPIN_ 8
     
  6. NR55RU

    NR55RU Гик

    Unixon
    А что если написать простую функцию аналог регулярных выражений только под заранее заданный шаблон так скажем. Ну если идеология строки не меняется конечно особо сильно.
    Ведь по сути как я понимаю в данном тексте, текст СМС все что начинается с третей "начала строки" и заканчивается ОК которое начинается с новой строки и после которого уже нет ничего, то есть конец текста.
    И того мы перебираем символ за символом в буфере, отсчитывая '\n' и после второго начинаем запоминать все символы как текст пока не встретим "ОК\0"
    То есть на каждом '\n' при переборе текста мы проверяем что следует в трех следующих символах и если это не "OK\0" то идем дальше а если ОНО то все кАнЭц :)
    Не вариант ?
     
  7. Unixon

    Unixon Оракул Модератор

    Сначала нужно узнать, есть ли в сообщении эти самые "\n". Это бы многое упростило.
     
  8. lerik2703

    lerik2703 Гик

    на конец сторуки модем указывает, переводом строки и возвратом каретки "\n\r" (0x0D,0x0A)
     
  9. Unixon

    Unixon Оракул Модератор

    Да, это понятно. Но оно там есть на самом деле или текст передается одним куском без переводов строк?
     
  10. lerik2703

    lerik2703 Гик

    текст сообщения идет одним куском даже если в смс пользователь использовал знак перевода строки!
     
  11. saniks

    saniks Нуб

    Cимволы тоже передаются, вот HEX-вид сообщения:
    Я как раз хотел так сделать, пробовал спомощью sscanf, строку вида 123,456,789 разбирает без проблем
    Код (Text):
    1    char buffer[100];
    2    char a[10];
    3    char b[10];
    4    char c[10];
    5    sscanf(buffer, "%[^','],%[^','],%[^',']", &a, &b, &c);
    Далее пытался исключить из области поиска 0x0a либо 0x0d
    Код (Text):
    sscanf(buffer, "[^'0D']%x,[^'0D']%x,[^'0D']%x", &a, &b, &c);
    sscanf(buffer, "[^'0A']%x,[^'0A']%x,[^'0A']%x", &a, &b, &c);
    Но видимо синтаксис неправильно задал, не сработало.
     
  12. lerik2703

    lerik2703 Гик

    при том в PDU знак переноса работает :)
     
  13. lerik2703

    lerik2703 Гик

    на сколько я помню одинарными кавычками объявляться литера 1 байт памяти а вы уже 2 байта пихаете ;)
     
  14. Megakoteyka

    Megakoteyka Оракул Модератор

    Вариант для данного случая: пробежать по строке, найти 8-ю кавычку, от нее отступить пару байт и копировать до появления двойного "\n\r".