Первый раз пробую подключить 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
Так, ну вот же… идёт движуха. Вас интересует почему светодиоды перестали реагировать? Вот тут: Serial.println(gprsSerial.read()); вы понимаете, что уничтожаете очередной байт из очереди буффера? И на следующей строке: char currSymb = gprsSerial.read(); вы считываете уже следующий байт: предыдущий уже был считан. Правильно написать так: Код (Text): //... char currSymb = gprsSerial.read(); Serial.println(currSymb); //...
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); }
http://arduino.ru/Reference/StringCompareTo compareTo() Сравнение двух строк, сравнивает если одна строка идет перед другой в алфавитном порядке или строки одинаковы. Строки сравниваются посимвольно, используя ASCII таблицу. Например, 'a' будет перед 'b', но после 'A'. Цифры идут перед буквами. Синтаксис string.compareTo(string2) Параметры string: первая переменная типа String string2: вторая переменная типа String Возвращаемое значение отрицательное число: если строка один идет перед строкой два 0: если первая строка идентична второй string2 положительное число: если строка один идет после строки string2
В моем случае получается: on off = 1 off off = 0 off on =-1 Лучше попробую написать вот так Код (Text): if (currStr == "on" ){} if (currStr == "off" ){}
Смущает что compareTo() возвращаемый integer, а для if нужен bool , т.е. получается не явное преобразование.
Во время написания скетча столкнулся еще с одной проблемой: функция 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); }