Проблемы с Softwareserial и GPRS-shield

Тема в разделе "Проводная и беспроводная связь", создана пользователем Nikiton, 26 авг 2017.

  1. Nikiton

    Nikiton Нуб

    У меня MEGA и GPRS-shield
    При любом AT запросе выводит в сериал "-1".. что это ? Поиск уже весь облазил.
    Не смотрите на скорость - разную ставил.
    Причем класс getDateTime из библиотеки выдает корректно
    Код:
    Код (C++):
    #include <SoftwareSerial.h>
    #include <stdio.h>
    #include <string.h>
    #include <GPRS_Shield_Arduino.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(9, 10);
    GPRS gprs(Serial1);

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

    String currStr = "";
    char result;
    void loop ()
    {
    delay(300);
    if (!gprsSerial.available()){
    delay(100);
    gprsSerial.print("AT+CCLK?\r\n");
    delay(1000);
    Serial.println(gprsSerial.read());

    }
    }
     
  2. rkit

    rkit Гуру

    А зачем вам на меге использовать программный сериал, когда там аппаратных три штуки? Ерундой не надо заниматься.
     
    BAR__MEN нравится это.
  3. Nikiton

    Nikiton Нуб

    )) Это все понятно. Что "-1" означает ?
     
  4. rkit

    rkit Гуру

    Значит, что буфер пустой и за время таймаута ничего не пришло.
     
  5. Nikiton

    Nikiton Нуб

    Менял на Serial1 - то же самое. Все классы из библиотеки работают нормально. Время, Смс и тд.
     
  6. rkit

    rkit Гуру

    Ну значит либо вы не подключили, либо щит не работает.
     
  7. b707

    b707 Гик

    Раз классы из библиотеки работают, а ваш код - нет, очевидно что проблема в нем. Если хотите, чтобы указали на ошибки - публикуйте свой код, а не примеры из библиотек
     
  8. Nikiton

    Nikiton Нуб

    То же так думал, скоратил скетч:
    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    GPRS gprs(Serial1);
    void setup ()
    {
    gprs.powerOn();
    Serial.begin(9600);
    Serial1.begin(9600);

    }
    void loop ()
    {
    delay(3000);
    Serial1.print("AT+CCLK?\r\n");
    delay(10000);
    Serial.println(Serial1.read());
    }
     
  9. Nikiton

    Nikiton Нуб

    на шилде все горит, скорость разную ставил..
     
  10. b707

    b707 Гик

    Вы неправильно работаете с Serial. Вы отсылаете в него команду AT+CCLK?\r\n, потом непонятно зачем очень долго ждете и читаете из порта один символ (функция Serial1.read() читает ТОЛЬКО ОДИН символ из порта). После этого все начинаете сначала. Так вы никогда не получите ответ.

    Вам надо дать АТ-команду 1 раз, а потом в цикле читать все символы, приходящие обратно. И задержки при чтении лучше вообще не использовать, чтобы не потерять данные.

    В библиотеке <GPRS_Shield_Arduino.h> в папке exemples есть скетч SIM900_Serial_Debug.ino - в нем пример, как правильно работать с Сериалом
     
  11. rkit

    rkit Гуру

    Получит. Но весь, но если ответ был, то будет символ.
     
  12. b707

    b707 Гик

    Если точнее - это будет даже не символ, а длина прочитанного сообщения, то есть 1 в случае ответа и -1 в случае пустого буфера. Чтобы получить символ, надо отправляеть его в монитор командой write
     
  13. Nikiton

    Nikiton Нуб

    Блин, веселье ))
    Убрал все тайминги, сканирую порт в лупе )) все - "-1"
    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    GPRS gprs(Serial1);
    void setup ()
    {
    gprs.powerOn();
    Serial.begin(9600);
    Serial1.begin(9600);
    Serial1.print("AT+CCLK?\r\n");
    }
    void loop ()
    {
    Serial.println(Serial1.read());
    }
    Сто процентов копать надо в сторону GPRS gprs(Serial1);
    Может можно обойти библиотеку эту, и использовать sim900.h ?
     
  14. b707

    b707 Гик

    Да вы в вашем коде ее и не используете... Вы же команду отсылаете стандартным Serial1.print, а ответ слушаете Serial1.read - так что результат вообще не зависит от библиотеки.Если модем включается (лампочки горят), вам надо проверять подключение и настройки Serial1
     
  15. rkit

    rkit Гуру

    Нет, символ.
     
  16. Nikiton

    Nikiton Нуб

    Да, для включения шилда библа )
    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    GPRS gprs(Serial1);
    void setup ()
    {
    gprs.powerOn();
    Serial.begin(9600);
    Serial1.begin(19200);
    }
    void loop ()
    {
    Serial1.print("AT+CCLK?\r\n");
    Serial.println(Serial1.read());
    }
    Приходит переодически что-то.. Видимо это длина.. Ща write попрбую
     
  17. Nikiton

    Nikiton Нуб

    поменял на write - кубики пошли
    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    GPRS gprs(Serial1);
    void setup ()
    {
    gprs.powerOn();
    Serial.begin(9600);
    Serial1.begin(19200);
    }
    void loop ()
    {
    Serial1.print("AT+CCLK?\r\n");
    Serial.write(Serial1.read());
    }
    Прикольно получается.. примеров с AT нормальных на амперке нет.. Не хотел на модеме экономить, в итоге такие же танцы с бубном.
     
  18. b707

    b707 Гик

    Как нет? в самой библиотеке. Я в сообщении #10 писал вам, где взять пример.
    Я, честно говоря. не представляю, какие могут проблемы с командой АТ
     
  19. Nikiton

    Nikiton Нуб

    То что вы сказали, там пример никакой, все тоже самое.
    Нашел chipdip нормальный пример
    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    GPRS gprs(Serial1);
    // буфер GPRS Serial
    char bufferGPRS_Serial[64];
    //int i = 0;
    int j = 0;
    void setup()
    {
    // включаем GPRS-шилд
    gprs.powerOn();
    // открываем последовательный порт для мониторинга действий в
    //программе
    Serial.begin(9600);
    // открываем последовательный порт
    // для связи с GPRS-устройством со скоростью 9600 бод
    // (Пример для Arduino Leonardo. Если у вас Arduino Uno, используйте
    //SoftwareSerial()
    Serial1.begin(19200);
    while (!Serial) {
    // ждём, пока не откроется монитор последовательного порта
    // для того, чтобы отследить все события в программе
    }
    // пока не установится связь с GPRS-устройством, будем крутиться в
    //теле функции
    //gprsTest();
    Serial1.println("AT+CCLK?");
    }
    void loop()
    {
    // считываем данные с компьютера и записываем их в GPRS Shield
    // serialPCread();
    // считываем данные с GPRS Shield и выводим их в Serial-порт
      serialGPRSread();
    }

    void serialGPRSread()
    {
    j = 0;
    // если появились данные с GPRS Shield
    if (Serial1.available() > 0) {
    while (Serial1.available() > 0) {
    // пока идёт передача данных,
    // записываем каждый байт в символьный массив
    bufferGPRS_Serial[j++]=(Serial1.read());
    }
    // добавляем символ конца строки
    bufferGPRS_Serial[j] = '\0';
    // выводим полученные данные с GPRS Shield в Serial-порт
    Serial.write(bufferGPRS_Serial);
    // очищаем буфер GPRS Serial
    //clearBufferGPRS_Serial();
    }
    }
    А теперь самое интересное, вся эта история работает через раз.
    Глючит, зависает. У многих такая же проблема тут.
    Спасибо амперка.
     
  20. b707

    b707 Гик

    К амперке отношения не имею - но причем здесь амперка. Я напомню - вы несколько дней вообще не могли ни одного символа от модема получить. Потом поменяли софт - ответ есть. Значит модем работает и дело вовсе не в нем, а в вашем софте.
    Я для себя переписал эту библиотеку для связи с совсем другим модемом - и она отлично работает. Просто ко всему надо с умением подходить.
    А что до того, что "у многих тут глючит" - так это потому. что многие относятся к ардуино как к чему-то готовому - купил, воткнул в розетку и пользуйся, как например, утюг. А это совсем не так, это конструктор, тут разбираться надо, книжки читать, изучать программирование и электронику...
     
    Nikiton нравится это.