Управление ардуиной второй ардуиной по UART
- Войдите на сайт для отправки комментариев
Товарищи знатоки, подскажите почему не получается управлять ардуиной при помощи другой ардуины соединив их по RX-TX. Значит на первой ардуине залил скетч с функцией - нажатие кнопки1 в серийный порт идет сообщение ON, при нажатии на кнопку2 выдает сообщение OFF, в сериал мониторе все работает. На второй ардуине залит нижеследующий скетч, может там я чето неправильно сделал, с компа при посылании сообщения ON через сериал монитор зажигается встроенный светодиод, а при сообщении OFF он гаснет, так как и задумано. Но при соединении двух ардуин накрест (RX1-TX2 и TX1-RX2) светодиод не зажигается, а только мигает светодиод RX, то есть сигнал идет, но управляемая ардуина не распознает его. Скорость на обеих платах выставлена 9600
void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); } void loop() { String value = Serial.readStringUntil('\n'); if (value == "ON") digitalWrite(LED_BUILTIN, HIGH); else if (value == "OFF") digitalWrite(LED_BUILTIN, LOW); }
А почитайте ка Вы, мил человек, про сравнение строчных переменных. Или передавайте 1 символ.
Mykaida, это String, он так тоже работает.
Mykaida, это String, он так тоже работает.
Точно? Счас в протеусе проверю.
По одному символу только что попробовал работает, типа incomingByte == 'H', но вот надо именно по набору символов управлять, вот как?
Попробуй на меге... там хотя-бы больше сериалов - в один из них можно Debug выводить.
У обьекта String определено несколько операторов ==, ему можно целые строки подсовывать, не обязательно один символ.
Попробуй на меге... там хотя-бы больше сериалов - в один из них можно Debug выводить.
Из-за особенностей проекта требуется именно NANку использовать и команды из набора символов.
Кода передатчика нет, потому разводим кофейную гущу и смотрим .... в восьмой строке замените '\n' на '\r' (это гуща так говорит, а хотите разумнее - давайте коды полностью).
Попробуй на меге... там хотя-бы больше сериалов - в один из них можно Debug выводить.
Из-за особенностей проекта требуется именно NANку использовать и команды из набора символов.
Отладишь и поменяешь хоть на Нано, хоть на мини про.
А так, наощупь что-то там отлаживать дураков нет.
martinways, когда между собой общаются две программы, обеспечение человекочитаемости команд, как правило, требует совершенно неоправданного перерасхода ресурсов. Поэтому замените Ваши строки на однобайтовые (если их количество не превышает 256) или двухбайтовые числа. Избавитесь и от тех проблем, с которыми уже успели столкнуться, и с от тех, с которыми еще не успели.
Из-за особенностей проекта требуется именно NANку использовать
А что, "особенности проекта" не позволяют попробовать на другом контроллере?
и команды из набора символов.
Так передатчик-то самый примитивный, чисто чтобы потестить функцию, елси заработает, то уже наварганю нужные команды. В серийный порт команды шлет исправно.
Из-за особенностей проекта требуется именно NANку использовать
А что, "особенности проекта" не позволяют попробовать на другом контроллере?
и команды из набора символов.
Да у меня просто как в песне - "Дайте, дайте сигарету... А нету, брат, а нету..")) Нанок пучок с алишки и одна Унка
Так передатчик-то самый примитивный,
Если не помогает, то в передатчике замените println на print, а конец строки руками подставьте.
По любому проблема в этом. Лучше бы конечно просто тупо посимвольно напечатать что приходит - сразу видно будет.
Так передатчик-то самый примитивный,
Если не помогает, то в передатчике замените println на print, а конец строки руками подставьте.
По любому проблема в этом. Лучше бы конечно просто тупо посимвольно напечатать что приходит - сразу видно будет.
Если меняю n на r, то даже с компа перестает управляться.
Так передатчик-то самый примитивный,
Если не помогает, то в передатчике замените println на print, а конец строки руками подставьте.
По любому проблема в этом. Лучше бы конечно просто тупо посимвольно напечатать что приходит - сразу видно будет.
Ну, дружище, помогли! Поменял на Print и конец строки поставил \n и все заработало, Вы - мозг! Благодарю!
Ну что посоветовали, то и сделал))
так видимо в конце строки два символа прилетало, возврат каретки и перевод строки )))
Таки да, а с \r не работало потому, что \n там и оставался - его никто не выедал. Говорю же, надо было печатать посимвольно - сразу никаких вопросов.
Таки да, а с \r не работало потому, что \n там и оставался - его никто не выедал. Говорю же, надо было печатать посимвольно - сразу никаких вопросов.
да, дополнив восьмую строку, всё бы заработало
Если не трудно, подскажите чем надо дополнить 8-ю строку, чтобы не дописывать в каждую команду \n ?
Если не трудно, подскажите чем надо дополнить 8-ю строку, чтобы не дописывать в каждую команду \n ?
так Вы так и не поняли, Евгений Петрович подсказал "\r\n" - или 0x0D, 0x0A в шестнадцатеричном, там два символа, вычитывать их надо полностью, println как раз эти символы и добавляет
приемник
передатчик, так, для теста
ТС, спросите зачем такой сложный скетч приёмника. Объясняю. Во-первых, ваш скетч из нулевого поста, все время тормозит loop() на время Timeout (по умолчанию 1 сек) функции readStringUntil(). Т.е. считайте что типа delay (1000) добавили в loop. Чтобы этого не происходило нужно писать так
но даже в этом случае, если по какой либо причине во время приёма информации от оппонента в конце строки скетч не дождётся \n будет опять задержка в 1 сек. Я уж не говорю про использование String, что считается моветон. Поэтому мой скетч предпочтительней.
ТС, спросите зачем такой сложный скетч приёмника. Объясняю. Во-первых, ваш скетч из нулевого поста, все время тормозит loop() на время Timeout (по умолчанию 1 сек) функции readStringUntil(). Т.е. считайте что типа delay (1000) добавили в loop. Чтобы этого не происходило нужно писать так
но даже в этом случае, если по какой либо причине во время приёма информации от оппонента в конце строки скетч не дождётся \n будет опять задержка в 1 сек. Я уж не говорю про использование String, что считается моветон. Поэтому мой скетч предпочтительней.
Спасибо, попробуем и Ваш вариант. Конкретно в моем исполнительном устройстве задержка в 1 сек будет некритична, но в других вариантах возможно очень даже.
Если не трудно, подскажите чем надо дополнить 8-ю строку, чтобы не дописывать в каждую команду \n ?
а надо не дополнить 8 строку, а проверять полученные данные правильно. (В передатчике ставить println .)
т.е. ваш вариант приёмника примерно такой