На плате с обратной стороны есть место под батарейку. Нафига она нужна как-то умалчивается. На сайте производителя в какой-то жуткой для простого обывателя картинке (что-то типа принципиальной схемы) написано "RTC battery". Насколько я помню, RTC - это "real time clock". Сталбыть в этой плате часики есть? А как их установить и потом время считывать? Или я что-то не так понял?
Посмотрел. Сразу вопрос. Часики выдают по запросу строку (string) формата: "yy.MM.dd, hh:mm:ss+/-zz". Объясните, плз, как из строки вытащить нужные данные для дальнейшей работы проргаммы. Скажем, как только время переваливает за 4 часа утра, делаем некую операцию (меряем температуру, см. мой проект). Я просто снтаксиса не знаю, как это описать. "**.**.**,04:**:**+02" так что ли?
Вам нужно распарсить строку. То есть разделить её на осмысленные токены (часы, минуты, секунды) и перевести к удобному типу данных (например, int). Для этого используйте функции: strtok — разбор на токены atoi — переводим строку в int
Набросал скетч: // подключаем библиотеку 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); } Выдает пустые строки на мониторе. Что не так?
Эмммм… да, совсем не так Смотрите, вы объявляете переменную `time`, ничего с ней не делаете и потом печатаете в Serial. Вот и получаете пустые строки. AT+CCLK — это всего лишь запрос на получение времени. Вы должны через `available` и `read` считать ответ. Подобно тому как это делалось для определения команды RING в вики-статье.
Так. Помогайте дальше Написал вот это: // подключаем библиотеку 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". И чего с этим делать? Видимо, как-то можно "склеить" символы? Или все-таки есть возможность считать сразу строку?
Serial.readBytesUntil() может в буфер (массив char) прочитать последовательность. const int BUF_SZ = 256; char buf[BUF_SZ]; int msg_len = Serial.readBytesUntil('\r',(char*)&buf[0],BUF_SZ);
Чегойто я не понимаю. Читаю в мануале:"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"
Вы не поняли функцию. Она складывает символы из порта в массив и возвращает вам их количество. После возврата из функции символы уже в массиве. А вы функции передаете адрес массива (адрес первого элемента).
Наверное не понял. Этот вот скетч выдает одни нули. Т.е. никакой информации в буфере нет, как я понял. // подключаем библиотеку 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); }
Ну вот смотрите. Предыдущий скетч данные выдавал (см.выше). Я туда просто добавил функцию, что Вы предложили (ну и выкинул то, что посчитал лишним ). Выдает нули. Так же в столбик. Может, где-то в синтаксисе начудил? Таймаута не выходит. До упора рисует нолики.
Ну посмотрите текст самой функции readBytesUntil(), там просто в цикле в буфер считываются символы, можете сами написать аналогичную функцию или встроить цикл чтения прямо в код. Перед каждым считыванием проверяйте Serial.available(). Да, еще в качестве разделителя нужно '\n' поставить.
Мне очень лестно, что Вы такого высокого мнения о моих способностях программиста. Я ж ЧАЙНИК в этих делах Дайте, плз, наводку, где текст функции глянуть?
Вот надо было сразу читать комменты внимательнее Поменял 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); }
Нет конечно Поменял на 9600, как и у Serial порта. Картинка поменялась. Но не принципиально. См вложение.