Помогите понять условие (код)
- Войдите на сайт для отправки комментариев
Всем привет.
Разбираюсь с SIM900. Не очень понятно как работакт код примера:
void loop() { touch(); if (!gprsSerial.available()) return; // Считываем очередной символ с платы char currSymb = gprsSerial.read(); if ('\r' == currSymb) { // Получен символ перевода строки, это значит, что текущее // сообщение от платы завершено и мы можем на него отреагировать. // Если текущая строка - это RING, то значит, нам кто-то звонит if (!currStr.compareTo("RING")) { //кокетничаем 3 секунды, чтобы дать услышать звонящему гудок delay(3000); //посылаем команду на поднятие трубки gprsSerial.println("ATA"); } currStr = ""; } else if (currSymb != '\n') { // Дополняем текущую команду новым сиволом // При этом игнорируем второй символ в последовательности переноса // строки: \r\n currStr += String(currSymb); } } /* * Функция провоцирует поддержание коммуникации с платой даже если * та была перезагружена без перезагрузки Arduino */ void touch() { if (millis() >= updateTime) { gprsSerial.println("AT"); updateTime += 5000; } }
Попытаюсь расписать что мне понятно и непонятно:
1. char currSymb = gprsSerial.read(); каждый цикл loop читаем по одной строке в переменную currSymb.
2. if ('\r' == currSymb) если полученная строка (или символ) равен \r идем дальше (тут возможно уже заблуждаюсь).
3. if (!currStr.compareTo("RING")) по логике в этой же полученной строке ищем совпадение RING, если тру отвечаем на звонок. Но почему выполняется тру если строит !, который означает инвертность условия?
4. В этом куске кода я совсем запутался:
currStr = "";
Онбнуляем (делаем пустое значение) переменной (она у нас изначально из void setup такая).
} else if (currSymb != '\n') { currStr += String(currSymb); }
Если не выполнилось условие из п.2 выполняется это условие. По логике тру срабатывает при равенстве считанной строки и символа новой строки. Но по логике опять инвертирующий восклицательный знак.
Далее к пустой переменной currStr добавляем значение прочитанное из порта в этом цикле.
Неделю бюсь не могу понять. Заранее всем спасибо за внимание!
Не очень понятно как работакт код примера:
Это всё потому, что лень документацию читать
1. char currSymb = gprsSerial.read(); каждый цикл loop читаем по одной строке в переменную currSymb.
Читаем, что возвращает read и прекращаем бредить про строку.
2. if ('\r' == currSymb) если полученная строка (или символ) равен \r идем дальше (тут возможно уже заблуждаюсь).
Читаем, про двойные и одинарные кавычки и прекращаем бредить про строку.
Не "идём дальше", а выполняем строки 12-19
3. if (!currStr.compareTo("RING")) по логике в этой же полученной строке ищем совпадение RING, если тру отвечаем на звонок. Но почему выполняется тру если строит !, который означает инвертность условия?
Читаем, что возвращает compareTo и прекращаем бредить про инвертность условия.
4. В этом куске кода я совсем запутался:
В коде
n = 0;
Вы не путаетесь? Так здесь практически тоже самое - очень похоже. То, что она у Вас "из setup такая", с чего бы? Она изменяется в 26-ой строке!
Неделю бюсь не могу понять.
Это "типичный случай так-называемого вранья". Бьётесь Вы маскимум полчаса. За неделю Вы бы прочитали документацию.
------------------------
Прошу заметить, ответы на ВСЕ Ваши непонятки лежат прямо на этом сайте, в разделе "Программирование", который Вы не удосужились не то, что выучить наизусть (а надо именно это), но даже просто прочитать.
Это всё потому, что лень документацию читать
Прошу заметить, ответы на ВСЕ Ваши непонятки лежат прямо на этом сайте, в разделе "Программирование", который Вы не удосужились не то, что выучить наизусть (а надо именно это), но даже просто прочитать.
Прочитав повторно, опять не опнял. Чтение и заучивание не всегда приводят к положительному процессу, нужно смысл понимать. Вот первый пункт мне уже непонятен сколько раз его не читай!
Serial.read() Cчитывает очередной доступный байт из буфера последовательного соединения.
Что является байтом? Один символ? Всё что я видел из Serial, на сегодняшний день, это сроки.
Это байт один символ, то получается кадлый цикл loop мы читаем под одному символу?
Про кавычки работрался: строка в двойных, символ в одинарных. Упустил этот момент.
То, что она у Вас "из setup такая", с чего бы? Она изменяется в 26-ой строке!
Далее к пустой переменной currStr добавляем значение символа currSymb (преобразованного в строку) прочитанного из порта в этом цикле. Получаем переменную с определённым символом. Тут я опять теряюсь, при следующем выполнении цикла мы полученную переменную currStr (с одним символом из порта внутри) сравниваем с RING и по окончании опять обнуляем currStr = ""; Как получается срока если ситаем 1 симвоз за раз и в каждом цикле обнуляем переменную currStr = "";?
Serial.read() Cчитывает очередной доступный байт из буфера последовательного соединения.
Что является байтом? Один символ? Всё что я видел из Serial, на сегодняшний день, это сроки.
Это байт один символ, то получается кадлый цикл loop мы читаем под одному символу?
да. команда read() читает по одному символу
Далее к пустой переменной currStr добавляем значение символа currSymb (преобразованного в строку) прочитанного из порта в этом цикле. Получаем переменную с определённым символом. Тут я опять теряюсь, при следующем выполнении цикла мы полученную переменную currStr (с одним символом из порта внутри) сравниваем с RING и по окончании опять обнуляем currStr = ""; Как получается срока если ситаем 1 симвоз за раз и в каждом цикле обнуляем переменную currStr = "";?
строка получается последовательным прибавлением по одному символу в каждом цикле. Сравнение с RING выполняется только тогда, когда пришел байт конца строки '\r'
Прочитав повторно, опять не опнял. Чтение и заучивание не всегда приводят к положительному процессу, нужно смысл понимать. Вот первый пункт мне уже непонятен сколько раз его не читай!
Serial.read() Cчитывает очередной доступный байт из буфера последовательного соединения.
Что является байтом? Один символ? Всё что я видел из Serial, на сегодняшний день, это сроки.
Это байт один символ, то получается кадлый цикл loop мы читаем под одному символу?
Похоже, Вам рано читать описание языка. Начните с учебника информатики для школьников.
currStr = "";
Далее к пустой переменной currStr добавляем значение символа currSymb (преобразованного в строку) прочитанного из порта в этом цикле. Получаем переменную с определённым символом. Тут я опять теряюсь, при следующем выполнении цикла мы полученную переменную currStr (с одним символом из порта внутри) сравниваем с RING и по окончании опять обнуляем currStr = ""; Как получается срока если ситаем 1 симвоз за раз и в каждом цикле обнуляем переменную currStr = "";?
Нету там такого!
Вы скобки в упор не замечасете или считаете, что они просто для украшения?