Случайные символы, передаваемые из ESP8266 в Arduino
Ниже приведен код для получения значения из Firebase и отправки полученных данных в arduino для выполнения необходимых действий.
Код здесь здесь отправляет строку "o"
в arduino один раз
//uploaded to ESP8266
.
.
.
if (cu_st == "c")
{
sent = 0;
}
cu_st = Firebase.getString("feeder");
if (cu_st == "o")
{
Serial.println("\t\trecd req to feed");
if(sent == 0)
{
esp.print("o");
sent =1;
cu_st = "c";
Serial.println("setting feeder to close in firebase");
Firebase.setString("feeder" ,"c");
}
.
.
.
Ниже приведен код, который получает значение, выполняет необходимые действия.
//uploaded to arduino
.
.
.
void feed_cmd()
{
while(ArduinoUno.available())
{
char valve = ArduinoUno.read();
Serial.print("feeder cmd recd ");
Serial.println(valve);
if(valve=='o')
{
digitalWrite(led, HIGH);
//feeder.write(0); //open position
open_time = millis();
feeder = 1 ;
Serial.println("I am opening feeder");
}
}
}
void close_feed()
{
if(feeder == 1)
{
close_time = millis();
if(close_time - open_time > 5000)
{
feeder = 0;
digitalWrite(led , LOW);
Serial.println("I am closing feeder") ;
}
}
}
.
.
.
Мое ожидание/понимание заключается в том, что:
feed_cmd()
постоянно проверяет наличие каких-либо данных
Как только он получает данные, светодиод включается и через 5 секунд close_feed()
выключает светодиод.
Но что происходит, так это то, что while()
в feed_cmd()
постоянно выполняется, показывая некоторые случайные данные, а также все то, что я сказал выше, также выполняется! (фото прилагается)
Почему существуют случайные последовательные данные, даже после отправки только один раз и даже после чтения отправленных данных?
Это плохое кодирование / оборудование?
Спасибо за чтение и буду очень признателен, если вы поможете мне разобраться в этом!!
Edit Я нашел эту ссылку smthg abt pin voltages, когда искал возможное объяснение поведения моего кода, если кто-то может упростить его и объяснить, это было бы лучше !!
1 ответ
Скорость передачи данных, напряжение и время должны совпадать, чтобы последовательная связь работала правильно.
Итак, установите оба ваших устройства на одинаковую скорость передачи данных (вы указываете номер в Serial.begin ()) и убедитесь, что они правильно подключены. (напряжения совпадают, TX - RX, и заземление подключено)
Вы можете просто прочитать/распечатать последовательный ввод на arduino с помощью чего-то вроде Serial.print(SoftSerial.read()) в своем коде, если вы считаете, что у вас неправильно подключен последовательный.
Также в несвязанной проблеме; esp32 при загрузке выдает данные на своей основной последовательной линии на 115200, которые вы не можете отключить. однако после этого вы можете использовать последовательный порт.
Вот копия того, что печатается на одном из моих;
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
неправильно истолковал вопрос как esp32. Я думаю, что 8266 выдает данные при загрузке с частотой 74880 бод, но не могу подтвердить, сделал ли я это с платой, которую я тестировал, или это было так. За исключением другой скорости загрузки, ответ один и тот же., @bobsburner
вот как я написал код для программного обеспечения : в Arduino Программное обеспечение arduino(3,2) // rx | tx
в esp8266 Программное обеспечение esp(D2 , D3) //rx | tx
При подключении я подключил 3 -> D3 и 2 ->> D2. Что касается источников питания, я подключил их оба к USB-порту ПК . В обоих кодах я сохранил `Serial.begin(9600)
и SoftwareSerial.begin(4800)
, @Somasundharam Sampath
Скорость (это число в скобках после .begin() ) должно быть одинаковым на обоих устройствах. Кроме того, если у вас есть 5 В Uno (под которым я подразумеваю высокое напряжение на выводе 5 В), вы можете повредить свой esp8266, соединив их вместе., @bobsburner
- Исправление последовательной связи, условие доступности последовательных данных проверяется даже после считывания всех отправленных данных.
- AT-команда не отвечает на последовательный монитор
- Последовательная связь ESP8266 с ATMega328P
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Чтение данных из Google Таблиц с помощью Nodemcu
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Пытаюсь прошить ESP8266 с помощью Arduino UNO
- ESP8266 отключается через несколько часов
Программное обеспечение на скорости 115200 бод?, @Juraj
@Juraj Serial monitor установлен на 9600 бод , softwareserial i.e отправка и прием данных от ESP установлен на 4800 бод... так вот в чем проблема?, @Somasundharam Sampath
оба программного обеспечения работают на 4800 бод?, @Juraj
@Juraj Да, это так! Вот что я попробовал, пожалуйста , дайте мне знать, если вы можете понять это: я просто запустил код arduino(отключив питание от esp8266, но не линии передачи данных между ними), каждый раз, когда arduino отправлял данные, цикл while в
feed_cmd
выдавал 23 байта(я изменил вышеприведенный код и получил 255 или 254 в качестве вывода на softserial.read ()), затем я удалил эти линии данных и увидел, что при отправке данных цикл while больше не выполнялся., @Somasundharam Sampath@Juraj Я начинаю думать, что это аппаратная проблема , в моем arduino контакты 0-7 открыты(то есть без этих черных головок гнездовых разъемов у него просто есть u-образные контакты), поэтому я использовал гнездовые разъемы для подключения к ним.. Я убедился, что они не соприкасаются, но все равно каждый раз, когда отправлялись данные, я получал дополнительные считываемые байты . Поэтому я подумал, что, возможно, есть какое-то короткое замыкание, и выбрал 2 контакта, которые находятся дальше, но теперь я получаю дополнительные 16 байт, @Somasundharam Sampath