Помогите с кодом, пожалуйста...
- Войдите на сайт для отправки комментариев
Вс, 15/06/2014 - 16:14
Подскажите с ошибками в коде...
#include <Keypad.h> String inp = ""; const byte ROWS = 4; //four rows const byte COLS = 4; //four columns //define the cymbols on the buttons of the keypads char hexaKeys[ROWS][COLS] = { { '1','2','3','A' } , { '4','5','6','B' } , { '7','8','9','C' } , { '*','0','#','D' } }; byte rowPins[ROWS] = { 14, 15, 16, 17}; //connect to the row pinouts of the keypad byte colPins[COLS] = { 7, 6, 5, 4}; //connect to the column pinouts of the keypad //initialize an instance of class NewKeypad Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); void setup(){ Serial.begin(9600); } void loop(){ char customKey = customKeypad.getKey(); if (customKey ){ Serial.println(customKey);} while (Serial.available()) { char input_char = Serial.read(); if (input_char == "B") { //stroka zakonchilas' //inp = TEST Sertial.println(inp); } else { inp += input; } } }
_________________________________________
Суть в кратце... Подключена клавиатура.... Символы с неё пишутся в customKey... Необходимо сравнить данные с клавиатуры, с неким значением... Пусть условно будет Код...
При компиляции кода выползают следующие ошибки...
________
sketch_jun15a:41: error: stray '\' in program
sketch_jun15a.ino: In function 'void loop()':
sketch_jun15a:41: error: 'u2028' was not declared in this scope
sketch_jun15a:41: error: expected `;' before 'if'
sketch_jun15a:47: error: 'else' without a previous 'if'
sketch_jun15a:49: error: 'input' was not declared in this scope
________
В особенности интересует суть ошибки - stray '\' in program
Так же при кавтоформатировании кода, выдаётся ошибка, о том, что много левых скобок...
Подскажите пожалуйста, как бороться с этими напастями... Как вы сами понимаете, программист из меня, тот ещё...
Заранее благодарю...
Убрать из строки 41 левый символ
А какой именно из них?
убрал... просто очистил строку...
но вылезло следующее... ISO C++ forbids comparison between pointer and integer
'B'
Спасибо.... Ошибок больше нет... Но и желаемого результата тоже=(
В данный момент, отрезок кода, имеет такой вид:
Но Переменная всё равно не выводится... Символы с клавиатуры идут... Затем я нажимаю "В"... и ничего не происходит...
Я ожидал увидеть так...
я нажимаю символы... После чего Проверяется условие, есть ли в буфере В... Если оно есть, то Печатаются все символы, набранные до В и само В...
Я изначально не так наваял код?
Подскажите неведующему)
Если B латинская, то всё должно работать.
Одно непонятно, зачем вводить с матричной клавиатуры и из Serial.
То, что символы введённые с клавиатуры, печатаюся, это временное явление - потом оно уберётся... что бы меньше шелухи поступало в процессинг...
По поводу В... Да, она была латинской... Заменил на другой символ... Ничего не вышло...
Даже более того, такое ощущение, что он не сравнивает...
После этого добавил в действия при совпавшем условии println... Но не тут-то было... не пишет...
Проблема не решена... Всё зависло в воздухе... помогите, кто знает... светч выглядит сейчас так...
у меня просто прям чутьё, что именно в этом месте загводка... - while (Serial.available())
Но понять почему, я не могу....
Исключите из лексикона слово процессинг, потому что ArduinoIDE - это не процессинг.
Вы нигде не написали, что и на какой клавиатуре нажимаете. Какой используете монитор для связи с ардуиной. Без этого сложно что либо сказать, потому что скетч вполне нормально выглядит.
Лично я закомментарил бы строки 35-40 (включительно и именно так). Потом добавил бы строку очистки входного буфера после строки 45. Типа:
inp = "";
Затем загрузил бы скетч и вводил в мониторе "123B", кнопка send. Если не получил в ответ ничего, то закомментарил бы строки 43, 48-51.
Программирование ладно, но с логикой надо дружить.
Используется матричная клавиатура... Нажимаю на ней символы и затем В... - по условию, должны печататься все ранее нажатые символы(если я правильно понимаю)...
По поводу закомментировать строчки - попробовал, не вышло... очистка переменной - да, забыл)
Какой монитор для связи с ардуино - это как трактовать? - запустил скетч - нажал монитор порта... проверяю... ничего военного) - или я не понял суть вопроса?
кнопка send - тоже не понял...
Стоит отметить, что символы с клавиатуры, в мониотр порта выводятся исправно... Если написать просто условие, что-то на подобие:
То сравнение проходит... следовательно Морока, в строке -
while
(
Serial
.available()), ну или на крайний случай
if
(inputchar ==
'B'
)... потому что идёт сравнение составляющей массива со строкой - (как-то запутанно)... в любом случае, что бы наступил мир и покой для моего головного мозга, мне просто необходимо сравнить символы с клавиатуры со строкой (просто ввести код -больше 3х символов и если он равен, то запустить процедуру) ... Мои товарищи подсказать не смогли - разводят руками - мол, должно работать...
Если вы видите простое решение проблемы, будте добры - напишите его пожалуйста (просто кусок скетча, что бы я ег овставить и оно заработало) - я отблагодарю(материально, если потребуется).
Вы внимательно посмотрите что куда вы сохраняете, и что куда выводите.
Выводите вы переменную inp. Внее данные попадают из переменной inputchar, которая, в свою очередь получает что-то из Serial.
То есть имеем цепочку Serial->inputchar->inp
Вопрос: где в ней ваша клавиатура и почему вы ждете что введенные с нее символы будут выводится?
Вот этот кусок кода:
Таки может и будет выводить все что прочитало с внешней клавиатуры (коды клавиш). Но СРАЗУ. Без всяких "B" и проч запоминаний. Работа с Serial и работа с клавиатурой - у вас живут отдельной жизнью.
P.S. Кстати "B" и "b" - это разрные символы. Так что смотрите еще и за тем какую b вы шлете в мониторе.
Клавиатура в этьой цепочке здесь - char inputchar = Serial.read();
считывание сигнала из монитора порта -поправьте, если я не прав...
В у меня одна и та же - для проверки взял её из массива символов для клавиатуры
Клавиатура в этьой цепочке здесь - char inputchar = Serial.read();
Я тут не вижу никакой работы с клавиатурой. Я вижу считывание символа из Serial порта.
Или, если вы настаиваите что это чтение клавиатуры, то устаканьте терминологию. Давайте уберем неоднозначность. Предлагаю "клавиатурой" называй, ту клавиатуру которая подключен к компьютеру, которой вы пользуетесь когда пишите тут на форуме, а ту которая подключена напрямаю к ардуине называть "кейпадом".
Итак, используя эти два понятия "клавиатура" и "кейпад". Попробуйте еще раз описать где и что вы нажимаете, и что ожидаете...
Все эти левые символы - ад копипастеров. Пишите код сами.
Хорошо... будь по вашему)
Символы с кейпада поступают в сериал порт...
С помощью кейпада нажимаю цифры(любые - допустим 123) - и затем нажимаю (на кейпаде) В.
Цифры выводятся в монитор порта... Они считываются этой командой - char inputchar = Serial.read();
И после нажатия В (на кейпаде) - должна вывестись переменная inp... С 'B', или без енё это уже не важно...
Но этого не происходит...
Символы с кейпада поступают в сериал порт...
То есть, вы утверждаете, что:
1. Кейпад имеет Serial интерфейс
2. К арудине он подключен двумя проводками на Rx (D0) /Tx (D1) пины (плюс земля, и, возможно питание).
Эти утверждения соотвествуют реальности?
Хорошо... будь по вашему)
Да мне вообще-то это не очень-то и нужно ;) Я просто пытаюсь помочь вам.
В первую очередь все эти вопросы нацелены на то, что-бы вы сами над ними задумались. Почему они возникают.
Потому что они могут:
1. Содержать в себе ответы на вашу проблему
2. Быть маркерами того, что на форуме вы тоже делаете "что-то нето". Обязанность за то что бы ОДНОЗНАЧНО и ПОЛНО передать картину - лежит целиком на вас.
А "неоднозначность в описании" может свидетельстововать о "неоднозначности в голове". А это может находить отражение и в коде. Так как на форуме может кто-то и "догадается", то сама ардуина - что ей сказали, то и будет делать :)
Пока же, вы сделали основные ошибок новичка:
1. Назвали тему черти-как. Как вы думете, в форуме "программирование" много тем, которые по сути не являются просьбой о помощи с кодом? так что, вообще все темы так называть? Как потом ориентироваться? Зачем тогда вообще придумали название тем? Я, обычно, вообще темы типа "помогите новичку", "помогите с кодом", "не работает скетч" - игнорирую.
2. Ни фига не описали какое у вас железо (какая плата, что за кейпад, что за либы используете, что и куда подключаете...): в резульатате нужно либо догадываться/предполагать, либо вытягивать из вас как из партизана на допоросе...
Не сделали ошибок "новичка" (в плохом смысле):
1. Нормально вставили код :)
2. Явно пытаетесь сами что-то делать, а не просто "а... помогите".
3. Пытаетесь выполнять советы, а не спорить и указывать другим что нужно делать (бывают и такие персонажи ;)
Да уж, перемешать клаву с кейпадом.. Явно некорректно описана задача. В этом то и вся проблема. Потому я и предлагал разделить проверку кейпада и сериал. Достал ящик попкорна, уфф. leshak, спасибо, вовремя подоспел, а то я бы еще неделю спрашивал что и как ))
Отключаем режим партизана...)
Используется платформа Arduino UNO.
Использую эту библиотеку (ссылка на скачивание бибилотеки - на всякий случай) для матричной клавиатуры(Кейпад).
Кейпад поключён слудющим образом - по порядку - первая четвёрка контактов - 4, 5, 6, 7. Вторая четвёрка так же по порядку, подключены к аналоговым входам, но так как мне не нужны аналоговые входы, обращение к ним как к цифровым - 17, 16, 15, 14 (или А3, А2, А1, А0 - соответственно).
Резисторы не используются, к ардуино подключен только кейпад (матричная клавиатура 4х4).
Кейпад, не имеет напрямую доступ к сериал порту, все нажатые кнопки записываются для начала в
А затем что бы вывести их в монитор порта - приравниваются к customKey:
Поправьте, если видите ошибку в моих суждениях...
Простите меня неведующего...)
Наводящий вопрос. Почему Вы нажимаете на кейпаде символ 'B', а ждете его из Serial?
А затем что бы вывести их в монитор порта - приравниваются к customKey:
Поправьте, если видите ошибку в моих суждениях...
Ну и? Вот тут я вижу чтение кейпада... и рассуждаете правильно. Читаете из кейпада и ОТПРАВЛЯЕТЕ в Serial (и должны увидеть нажатия клавиш в Serial Monitor на компе... только "сразу", а не после "запоминания").
Этот кусок кода у вас работает? Можете, еще, заменить Serial.println(customKey); на
Что-бы проще различать в логе, что откуда пришло. Если будут лезть какие кракозяблы, или будут просто видно только надпись "Keypad:", а дальше в строки "ничего не видно", то поменяйте Serial.println(customKey) на Serial.println(customKey,DEC); Что-бывидеть именно коды символов, а не их Ascii представление.
Читаете, обращаю ваше внимание, в переменную customKey
А вот почему вы решили, что " inputchar = Serial.read();" это чтение кейпада, почему вы в проверках сравниваете переменную if (inputchar == 'B') - для меня полная загадка.
То есть вы читаете данные из Serial-монитора (которые послыются с компьютера, с помощью Serial Monitor), ищите букву "B" в данных пришедших с КОМПЬЮТЕРА и при этом удивляетесь, что оно не реагирует на клавишу "B" на кейпаде.
Стало понятно в чем ваша проблема?
P.S. Что-то у меня вознколо подозрение, что вы предполагает, что то что отправленно в Serial, с помощью Serial.println можно тут же прочитать с помощью Serial.read(). Я угадал ход ваших мыслей?
'В' я нажимаю на кейпаде - следовательно он печатется... Думаю, он печатается в сериал порту - Serial.println(customKey)... - вот я там его и жду...
Вы хотите сказать, я жду то, что там и не появляется? То есть необходимо сравнивать не из сериал порта, а напрямую, то что идёт из кейпада??...
P.S. Что-то у меня вознколо подозрение, что вы предполагает, что то что отправленно в Serial, с помощью Serial.println можно тут же прочитать с помощью Serial.read(). Я угадал ход ваших мыслей?
- ну да... я в принципе так и думал - сначала я писал часть кода таким образом:
Но при этом вылазила ошибка... - что-то насчёт сравнения переменной со строкой, или в этом районе...:
...
'В' я нажимаю на кейпаде - следовательно он печатется... Думаю, он печатается в сериал порту - Serial.println(customKey)... - вот я там его и жду...
Ну и.... и что вы там видите? (кстати, на всякий случай "там" это же Serial Monitor?)
Вы хотите сказать, я жду то, что там и не появляется? То есть необходимо сравнивать не из сериал порта, а напрямую, то что идёт из клавиатуры??...
Хех.... опять сбились с терминологии, путаете всех ( ну ведь даже в коде у вас keypad, и библиотека так называется).
Что необходимо - это решать вам. Если вы хотите реагировать на нажатия клавиш кейпада, то логично что проверять нужно то что пришло из него, если хотите реагировать на данные приходящие от компа, то нужно сравнивать данные из Serial-а.
Вот смотрите. У вас есть мобильный (кейпад) и стационарный (Serial) телефон. Один у одного уха, другой у другого. По мобильному вы только слушаете, по стационарном и слушаете и говорите...
Что деалет ваш скетч:
1. Все что услышал по мобильному - пересказывает в стационраный, не вникая в смысл сказанного
2. Слушает стационраный, ждет кодовой фразы "грузите бочки апельсинах".....
Что происходит когда по мобильному вам сказали "грузите бочки апульсинах"? А ничего.. вы пересказали это в стационарный и тут же забыли.
Вообщем сейчас вы ждете кодовой фразы по стационарному телефону, и при этом удивляетесь что никто не реагируют на фразы из мобильного.
P.S. Что-то у меня вознколо подозрение, что вы предполагает, что то что отправленно в Serial, с помощью Serial.println можно тут же прочитать с помощью Serial.read(). Я угадал ход ваших мыслей?
- ну да... я в принципе так и думал - сначала я писал часть кода таким образом:
Нет. Все это происходит не так. Какой в этом смысл? Если данные уже в микроконтроллере, и нужны они микроконтроллеру, то зачем их гонять через Serial? Просто сохраняем и в переменной и все.
Serial, по сути состоит из двух ВХОДА и ВЫХОДА. Как "наушники" и "микрофон".
Все что вы послали на выход (Serial.print/write) - прийдет на компьютер. Все это данные которые "ушли" из ардуины и больше она про них не знает. Это то что она "выдала в эфир".
Что-то бы эти данные возникли на ВХОДЕ (serial.read()) их должен кто-то "вернуть обратно". Выступить вкачестве эха. Это может либо компьютера (тогда там должна быть програмка, которая читает данные из COM-порта и тут же отправляет их обратно), либо.... физически закоротить между собой пины Rx/Tx, подать "выход на вход".
Но, идинственный случай когда может потребоваться отправлять даныне с помощью Serial.print() и тут же читать их через Serial.read() - это когда нужно проверить Serial физически работоспособен. Что его не сожгли и т.п. То есть только в диагностически целях. Зачем это может потребоваться в "рабочем скетче" - я не могу вообразить.
char inputchar = Serial.read();
Но при этом вылазила ошибка... - что-то насчёт сравнения переменной со строкой, или в этом районе...:
Читаем:
char | Аппаратная платформа Arduino
string - текстовые строки | Аппаратная платформа Arduino
String | Аппаратная платформа Arduino
Потом ВНИМАТЕЛЬНО смотрим на свой код. Это компьютер. Тут каждый сивол играет роль. В том числе и где какие кавычки используются. С точки зрения комьютера - они разные. В отличие от человека, догадатся "по здравому смыслу" - он не может. Выполняет "то что сказали", а что сказали - зависит от каждого символа.
В двух словах описание вашей ситуации, бытовым языком.
Вы хотели: подойти к девушке и спросить "Вас случайно не Таня зовут?".
Вы сделали: подошли к женскому общежитию и крикнули "привет, тебя не Таня зовут?". И что вам должно ответить общежитие?