GPRS Shild проблемы

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

  1. idShura

    idShura Нерд

    Первый раз пробую подключить GPRS Shild. Для теста нашел готовый пример, немного его изменил и дальше у меня полный тупик.

    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
     
    //для зелёного светодиода будем использовать второй цифровой вход,
    //а для жёлтого - третий
     
    int ledPin = 10;
     
    void setup()
    {
        gprsSerial.begin(19200);
        Serial.begin(19200);
        pinMode(ledPin, OUTPUT);
     
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
    }
     
        String currStr = "";
     
        // Переменная принимает значение True, если текущая строка является сообщением
        boolean isStringMessage = false;
     
    void loop()
    {
        if (!gprsSerial.available())
        {
          return;
        }
       
        Serial.println(gprsSerial.read());
       
        char currSymb = gprsSerial.read();  
        if ('\r' == currSymb)
        {
            if (isStringMessage)
            {
     
                if (currStr.compareTo("on"))
                {
                  Serial.println("ON");
                    digitalWrite(ledPin, HIGH);
                }
               
                if (currStr.compareTo("off"))
                {
                  Serial.println("OFF");
                    digitalWrite(ledPin, LOW);
                }
             
                isStringMessage = false;
            }
            else
            {
                if (currStr.startsWith("+CMT"))
                {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
           
            currStr = "";
           
        }
        else if ('\n' != currSymb)
        {
            currStr += String(currSymb);
        }
    }
    Для отладки в код вставил Serial.println(gprsSerial.read());

    Открываю com порт
    Включаю arduino и затем сам GPRS Shild и вижу следующее (Выводиться один раз без цикла):


    Код (Text):
    0
     
    255
     
    255
     
    255
     
    255
     
    255
     
    255
     
    255
     
    255
    Жду когда индикация покажет что сеть найдена, закрываю com порт и снова открываю и вижу следующее:
    Код (Text):
    65
    43
    77
    70
    49
    13
    79
    13
    65
    43
    70
    61
    44
    49
    13
    79
    13
    65
    43
    80
    83
    34
    77
    13
    10
    75
    10
    84
    67
    77
    61
    44
     
  2. nailxx

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

    Так, ну вот же… идёт движуха. Вас интересует почему светодиоды перестали реагировать? Вот тут:

    Serial.println(gprsSerial.read());

    вы понимаете, что уничтожаете очередной байт из очереди буффера? И на следующей строке:

    char currSymb = gprsSerial.read();

    вы считываете уже следующий байт: предыдущий уже был считан. Правильно написать так:

    Код (Text):

    //...
    char currSymb = gprsSerial.read();
    Serial.println(currSymb);
    //...
     
     
    Megakoteyka нравится это.
  3. idShura

    idShura Нерд

    nailxx спасибо.

    Если послать "off" - светодиод загорается, - "on" - светодиод выключается. Я этого сначала не обнаружил а потом неправильно добавил вывод отладочной информации и поэтому запутался.

    Пока не совсем понимаю как работает compareTo() чтобы уже окончательно разобраться.

    Код (Text):
    if (currStr.compareTo("on"))
                {
                  Serial.println("ON");
                    digitalWrite(ledPin, HIGH);
                }
             
                if (currStr.compareTo("off"))
                {
                  Serial.println("OFF");
                    digitalWrite(ledPin, LOW);
                }
     
  4. Megakoteyka

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

    http://arduino.ru/Reference/StringCompareTo

    compareTo()

    Сравнение двух строк, сравнивает если одна строка идет перед другой в алфавитном порядке или строки одинаковы. Строки сравниваются посимвольно, используя ASCII таблицу. Например, 'a' будет перед 'b', но после 'A'. Цифры идут перед буквами.
    Синтаксис

    string.compareTo(string2)
    Параметры

    string: первая переменная типа String
    string2: вторая переменная типа String
    Возвращаемое значение

    отрицательное число: если строка один идет перед строкой два
    0: если первая строка идентична второй string2
    положительное число: если строка один идет после строки string2
     
    nailxx нравится это.
  5. idShura

    idShura Нерд

    В моем случае получается:
    on off = 1
    off off = 0
    off on =-1

    Лучше попробую написать вот так
    Код (Text):
    if (currStr ==  "on" ){}
    if (currStr ==  "off" ){}
     
  6. Megakoteyka

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

    Все верно, так и должно быть. А что Вас смущает?
     
  7. idShura

    idShura Нерд

    Смущает что compareTo() возвращаемый integer, а для if нужен bool , т.е. получается не явное преобразование.
     
  8. Megakoteyka

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

    Код (Text):
    if(str1.compareTo(str2) > 0)// < 0, == 0
    {
    }
     
  9. idShura

    idShura Нерд

    Во время написания скетча столкнулся еще с одной проблемой:

    функция sendTextMessage("Temp = "+ String(temp) + (char)176 +"C") отправляет смс, а на телефоне вижу следующее "Temp = 28,35"

    Код (Text):
    void sendTextMessage(String t) {
        // Устанавливает текстовый режим для SMS-сообщений
        gprsSerial.print("AT+CMGF=1\r");
        delay(100); // даём время на усваивание команды
        // Устанавливаем адресата: телефонный номер в международном формате
        gprsSerial.println("AT + CMGS = \"+79031034423\"");
        delay(100);
        // Пишем текст сообщения
        gprsSerial.println(t);
        delay(100);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        gprsSerial.println((char)26);
    }