• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Непонятки с software serial

GT!

New member
Происходит следующее...
esp версия 01, прошивка 9.2, прицеплен к arduino uno через software serial. Запускаю на скорости 9600 (насколько понимаю, большую скорось мягкий порт не сильно любит). Перегружаю модуль AT+RST и пытаюсь выловить "Ready" в том, что он выплевывает при запуске, вот таким образом:
result = toESP.find("Ready");
Не находится... Но если этот же find поворить несколько раз (например, тупо скопировав ту же строчку), с третьего раза (иногда со второго) уверенно находится... Чего-то я не понимаю. У кого-нибудь наблюдалось что-то похожее?
Заранее очч признателен за соображения!
 

JustACat

Moderator
Команда форума
Ну, начнем с того, что там не "Ready", а "ready"...
Перво-наперво - обновите прошивку ESP на 0.21.
Далее, проверьте работу с ПК без Arduino. Если переходника нет, то используйте встроенный в ардуино переходник, замкнув Reset ардуинки, чтобы она не стартовала и не мешалась.
Вставьте в код ардуинковского скрипта перенаправление данных, получаемых от ESP, в порт на ПК, чтобы воочию видеть, что там прилетает.
Ну и я бы искал (собственно я так и делал) последовательность сам, не используя find - т.к. это не очень надежно.
 

GT!

New member
Большое спасибо за ответ!
Прошивку попробую поменять... Начинал с поновее, но в послдених почему-то прибили смену скорости, если я правильно понял.
В прошивке почему-то именно "Ready"... смотрел ESPlorer-ом и чем-то еще. Смотрел с переходником: с ним все более-менее работает, цепляется к раутеру и т.д. Я поэтому и грешу на мягкий порт, что это именно с ним какие-то странности начинаются. На меге все более-менее предсказуемо работало.
А код перенаправления, это что-то типа "Serial.write(toESP.read());"? Там всякая ахинея.
Спасибо еще раз!!!
 

JustACat

Moderator
Команда форума
если я правильно понял
Как раз совсем наоборот. Вот, поглядите на набор команд 21-ой версии. Команда AT+ UART как раз для вас.

В прошивке почему-то именно "Ready"
Хм, ну, может в старой было именно так, честно говоря, я почти сразу перешился на 20-ую, а затем погодя и на 21-ую, а сейчас и вовсе на 22 сидел.
Так вот, на всех на них ready с маленькой буквы идет. Но если на вашей в Terminal падает с большой - значит тогда все верно.

Я поэтому и грешу на мягкий порт, что это именно с ним какие-то странности начинаются.
Да, с ним ESP работает плохо. Уж лучше используйте его для связи с ПК, а ESP подцепите на хардовый. Тогда конечно неудобно перешивать будет, но работать будет лучше.
Я бы советовал отлаживать на чем-то типа меги как раз, чтобы были хардварные порты побольше. А потом тупо перекинуть на что-то мелкое, только поменяв порт.
Отлаженный на меге код должен работать точно так же и на uno и на других ардуйнях. Но если он отлажен на все 100%, и вы уверены в его работе при любых финтах и условиях.

А код перенаправления, это что-то типа
Именно.
Код:
void loop(){
    if(Serial.available()){ // Прилетело от ESP
        uint8_t in = Serial.read();
        #if defined __AVR_ATmega2560__
        Serial1.write(in); // Отправляем на ПК
        #endif
        // тут далее обрабатываем принятый байт in
        // ...
    }
    #if defined __AVR_ATmega2560__
    if(Serial1.available()) // Прилетело от ПО
        Serial.write(Serial1.read()); // Отправляем на ESP
    #endif
}
Никакой ахинеи быть при этом не должно, если конечно у вас скорости на оба порта выставлены верные. Ну и на ПК скорость правильная в терминале стоит.
Таким образом я не только вижу, что ESP выплевывает, но могу и сам обратно ей какую-то команду скормить прямо через ардуину.
 

GT!

New member
Спасибо огромное!!
Я-то пытался скорость через AT+CIOBAUD ставить. Попробую по-новой на новой прошивке. :)
Мягкий порт хочу использовать вот по какой причине: хочу небольшой сервер сделать из micro pro и ESP-03. Очч не хотелось ставить какие-либо перемычки для заливки кода и прочего. Думал uart именно на это использовать, а с вай-файкой через мягкий порт... По этой причине пытаюсь поднять сначала на uno (не нужно дрызгаться с проводом, цепляя его то туда, то сюда, да и ничего припаивать не нужно), а потом уже на микру пертаскивать.
Кстати, появилась версия того, что у меня происходит. Может такое быть, что при запуске модуля буфер у software serial заполняется построчно? То есть, сначала падает "ok", потом что-то еще, а в третьей строке "module Ready". Последовательные find как-то этот буфер обновляют, что ли?
Еще раз, спасибо большущее!!!
 

JustACat

Moderator
Команда форума
Мягкий порт хочу использовать вот по какой причине: хочу небольшой сервер сделать из micro pro и ESP-03.
Сервер - это понятно, непонятно, зачем вам два UART'а? То есть обычно нужен только 1 - для связи ардуино и ESP. 2 нужен только для дебага-отладки.
Поэтому я предполагаю так: делаете на меге, у нее аж 4 аппаратных, отлаживаете на ней, чтобы все работало, потом просто этот код прошиваете в вашу микро или что у вас там и пользуетесь. Там уже не нужен 2 уарт. Или я опять чего-то не понимаю?

К слову сказать, я вообще хочу реализовать перепрошивку ардуины по воздуху прямо через ESP (это вполне возможно, народ это делал уже). Но это мои планы на будущее, пока руки не дошли, времени не так много свободного, увы...

Кстати, появилась версия того, что у меня происходит.
На самом деле буфер по умолчанию вообще очень мелкий, советую его увеличить.
Для аппаратного сериала оно находится тут: \Arduino\hardware\arduino\cores\arduino\HardwareSerial.cpp
Параметр SERIAL_BUFFER_SIZE, у меня стоит 128 сейчас.
Для программного подобный параметр должен быть в соответствующем файле.
Только особо не увлекайтесь, ведь размер этого буфера (помноженный на два - для приема+отправки) отъедает доступную RAM, а ее не много на мелких ардуинках.

Так вот, к чему я это, вполне возможно, что у вас реально сразу после старта не успевает читать ваш код то, что прилетает от ESP, буферы переполняются и, усе...
Поэтому я еще раз повторюсь: попробуйте вычитывать побайтно и самостоятельно проверять, а не через find... Я этот find не использовал, и не знаю, что там наворотили ребята из arduino... Как вариант - посмотреть на код этого find'а. Ведь у ардуино коды все в наличии идут вместе со средой.
 

GT!

New member
На меге все более-менее работало, кривости начались с попытками перейти на software serialююю Видимо, я что-то кривое сделал. Буду пробовать, как вы говорите. Вот только дебага как раз многовато получается...

С развмером буфера, нашел в SoftwareSerial.h (Program Files (x86)\Arduino\libraries) вот такое: #define _SS_MAX_RX_BUFF 256 // RX buffer size - там было 64 прописано... исправил достаточно давно. Пожалуй, надо 128 поставаить. Пробовал паузы расставлять перед считыванием - вообще никакого эфекта.

Еще раз, спасибо большое!! Буду дальше ковыряться как время будет. А заливку ардуины через wifi мне тоже очч хочется сделать со временем.
 
Последнее редактирование:
Сверху Снизу