А теперь про GPRS Shield

Тема в разделе "Arduino & Shields", создана пользователем bvv, 1 окт 2012.

  1. bvv

    bvv Нерд

    На плате с обратной стороны есть место под батарейку. Нафига она нужна как-то умалчивается. На сайте производителя в какой-то жуткой для простого обывателя картинке (что-то типа принципиальной схемы) написано "RTC battery". Насколько я помню, RTC - это "real time clock". Сталбыть в этой плате часики есть? А как их установить и потом время считывать?
    Или я что-то не так понял?
     
  2. nailxx

    nailxx Официальный Нерд Администратор

  3. bvv

    bvv Нерд

    Спасибо :)
     
  4. bvv

    bvv Нерд

    Посмотрел. Сразу вопрос. Часики выдают по запросу строку (string) формата: "yy.MM.dd, hh:mm:ss+/-zz". Объясните, плз, как из строки вытащить нужные данные для дальнейшей работы проргаммы. Скажем, как только время переваливает за 4 часа утра, делаем некую операцию (меряем температуру, см. мой проект). Я просто снтаксиса не знаю, как это описать. "**.**.**,04:**:**+02" так что ли? :)
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    Вам нужно распарсить строку. То есть разделить её на осмысленные токены (часы, минуты, секунды) и перевести к удобному типу данных (например, int). Для этого используйте функции:

    strtok — разбор на токены
    atoi — переводим строку в int
     
  6. bvv

    bvv Нерд

    Набросал скетч:
    // подключаем библиотеку GPRS модуля
    #include <SoftwareSerial.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);

    void setup ()
    {
    gprsSerial.begin(19200);
    Serial.begin(9600);
    }

    void loop ()
    {
    String time;

    gprsSerial.print("AT+CCLK=time");

    Serial.println(time);
    Serial.print(time);
    }

    Выдает пустые строки на мониторе. Что не так?
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Эмммм… да, совсем не так :)

    Смотрите, вы объявляете переменную `time`, ничего с ней не делаете и потом печатаете в Serial. Вот и получаете пустые строки. AT+CCLK — это всего лишь запрос на получение времени. Вы должны через `available` и `read` считать ответ. Подобно тому как это делалось для определения команды RING в вики-статье.
     
  8. bvv

    bvv Нерд

    Так. Помогайте дальше :)
    Написал вот это:

    // подключаем библиотеку GPRS модуля
    #include <SoftwareSerial.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);

    void setup ()
    {
    gprsSerial.begin(19200);
    Serial.begin(9600);
    }

    String currStr = "";

    void loop ()

    {
    if (!gprsSerial.available())
    gprsSerial.println("AT+CCLK?");

    // Считываем очередной символ с платы
    char currSymb = gprsSerial.read();

    currStr = String(currSymb);
    Serial.println(currStr);
    delay(300);
    }

    Оно мне исправно выдает данные. Но по одному символу в столбик. В мануале на GPRS shield вроде написано, что возвращает строку, но в ардуино я что-то не смог объявить переменную строкой и потом её считать. Ругается. Просит "char". И чего с этим делать? Видимо, как-то можно "склеить" символы? Или все-таки есть возможность считать сразу строку?
     
  9. Unixon

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

    Serial.readBytesUntil() может в буфер (массив char) прочитать последовательность.

    const int BUF_SZ = 256;
    char buf[BUF_SZ];
    int msg_len = Serial.readBytesUntil('\r',(char*)&buf[0],BUF_SZ);
     
  10. bvv

    bvv Нерд

    Чегойто я не понимаю.
    Читаю в мануале:"Serial.readBytesUntil() reads characters from the serial buffer into an array. " Т.е функция читает ИЗ (from), буфера некий массив. Его же предварительно туда загнать надо? Далее там же:"Serial.readBytesUntil() returns the number of characters read into the buffer" Т.е. функция возвращает количество символов, считанных из буфера. Мне кажется, что это не совсем то. Мне надо не количество символов, а сами символы в удобоваримом виде.
    Вот помогите мне написать на понятном для ардуино языке следующий алгоритм:
    - считываем с платы показания времени
    - загоняем это все в буфер
    - из буфера считываем строку в формате "yy.MM.dd, hh:mm:ss+/-zz"
     
  11. Unixon

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

    Вы не поняли функцию. Она складывает символы из порта в массив и возвращает вам их количество. После возврата из функции символы уже в массиве. А вы функции передаете адрес массива (адрес первого элемента).
     
  12. bvv

    bvv Нерд

    Наверное не понял. Этот вот скетч выдает одни нули. Т.е. никакой информации в буфере нет, как я понял.

    // подключаем библиотеку GPRS модуля
    #include <SoftwareSerial.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);

    void setup ()
    {
    gprsSerial.begin(19200);
    Serial.begin(9600);
    }

    void loop ()

    {
    if (!gprsSerial.available())
    gprsSerial.println("AT+CCLK?");

    const int BUF_SZ = 256;
    char buf[BUF_SZ];
    int msg_len = Serial.readBytesUntil('\r',(char*)&buf[0],BUF_SZ);

    Serial.println(msg_len);
    delay(300);
    }
     
  13. Unixon

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

    А таймаут не выходит?

    p.s. вы строку читаете из того порта? (Serial -> gprsSerial)
     
  14. bvv

    bvv Нерд

    Ну вот смотрите. Предыдущий скетч данные выдавал (см.выше). Я туда просто добавил функцию, что Вы предложили (ну и выкинул то, что посчитал лишним :) ). Выдает нули. Так же в столбик. Может, где-то в синтаксисе начудил?
    Таймаута не выходит. До упора рисует нолики.
     
  15. Unixon

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

    Ну посмотрите текст самой функции readBytesUntil(), там просто в цикле в буфер считываются символы, можете сами написать аналогичную функцию или встроить цикл чтения прямо в код. Перед каждым считыванием проверяйте Serial.available(). Да, еще в качестве разделителя нужно '\n' поставить.
     
  16. bvv

    bvv Нерд

    Мне очень лестно, что Вы такого высокого мнения о моих способностях программиста. Я ж ЧАЙНИК в этих делах :) Дайте, плз, наводку, где текст функции глянуть?
     
  17. Unixon

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

    Здесь: $ARDUINO_ROOT/hardware/arduino/cores/arduino/ , файл Stream.cpp .
     
  18. bvv

    bvv Нерд

    Вот надо было сразу читать комменты внимательнее :) Поменял Serial на gprsSerial. Выдает нечто (см. вложение). И что это? Текст скетча ниже.

    // подключаем библиотеку GPRS модуля
    #include <SoftwareSerial.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);

    void setup ()
    {
    gprsSerial.begin(19200);
    Serial.begin(9600);
    }

    void loop ()
    {
    const int BUF_SZ = 256;
    char buf[BUF_SZ];
    int msg_len = gprsSerial.readBytesUntil('\r',(char*)&buf[0],BUF_SZ);
    if (!gprsSerial.available())

    gprsSerial.println("AT+CCLK?");

    Serial.println(msg_len);
    delay(300);
    }
     

    Вложения:

    • скрин.jpg
      скрин.jpg
      Размер файла:
      54,4 КБ
      Просмотров:
      741
  19. Unixon

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

    В скорости порта уверены (19200) ?
     
  20. bvv

    bvv Нерд

    Нет конечно :) Поменял на 9600, как и у Serial порта. Картинка поменялась. Но не принципиально. См вложение.
     

    Вложения:

    • скрин2.jpg
      скрин2.jpg
      Размер файла:
      53,3 КБ
      Просмотров:
      729