Проблемы с последовательной связью между Arduino и ESP8266.
Я пытался заставить Arduino и ESP8266 взаимодействовать друг с другом через последовательный порт. ESP8266 использует для связи класс Serial
, а Arduino использует SoftwareSerial
.
Проблема в том, что когда я пытаюсь отправить данные с Arduino на ESP8266, ESP8266 получает только первый символ отправленной строки. Например, если я отправлю строку «кожа», ESP8266 получит только букву «l». Оба устройства работают на скорости 38400 бод, хотя я пробовал 9600 бод с аналогичными результатами (очевидно, SoftwareSerial
более надежен при более низких скоростях передачи).
Вот соответствующий код, который работает на обоих устройствах:
Код Arduino:
#include <stdlib.h>
#include <SoftwareSerial.h>
#define COMMAND_TILT 'c'
#define SOFTWARE_SERIAL_BAUD_RATE 38400
#define ESP_RX 8
#define ESP_TX 9
SoftwareSerial esp(ESP_RX, ESP_TX);
void setup()
{
...
esp.begin(SOFTWARE_SERIAL_BAUD_RATE);
...
}
void loop()
{
if (esp.available() > 0) {
String data;
while (esp.available() > 0) {
data += (char) esp.read();
}
char command = data.charAt(0);
data.remove(0, 1);
int value = data.toInt();
char buf[STR_BUF_LEN];
switch (command) {
case COMMAND_TILT:
...
sprintf(buf, "%c%d", COMMAND_TILT, value);
esp.write(buf);
break;
...
}
}
delay(100);
}
...
Код ESP8266:
#define SERIAL_BAUD_RATE 38400
void setup()
{
...
Serial.begin(SERIAL_BAUD_RATE);
...
}
void loop()
{
...
if (Serial.available() > 0) {
String data;
while (Serial.available() > 0) {
data += (char) Serial.read();
}
char command = data.charAt(0);
data.remove(0, 1);
// проблема: теперь data.c_str() пуст, хотя должен содержать целое число в строковом формате
...
delay(100);
}
}
...
Если вам интересно, я запускаю клиент MQTT на ESP8266 и управляю некоторыми шаговыми двигателями и реле на Arduino.
@GreatHam, 👍0
Обсуждение1 ответ
Лучший ответ:
Причина проблемы заключалась в том, что ESP слишком быстро считывал char
, а это означало, что он прекращал работу до того, как следующий char
мог быть отправлен с Arduino. Чтобы решить эту проблему, я просто добавил задержку в 10 мс между каждым вызовом Serial.read()
в ESP.
- AT-команда не отвечает на последовательный монитор
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Повреждение данных SoftwareSerial - поиск предложений
- Можно ли использовать SoftwareSerial в ESP01
- Ошибка отправки данных из ESP8266 в Uno
- Исправление последовательной связи, условие доступности последовательных данных проверяется даже после считывания всех отправленных данных.
- Как использовать 2 последовательных порта, когда библиотека WifiEsp использует один из обоих
используйте SoftwareSerial на скорости 9600 бод. не более, @Juraj
@Юрай, если ты прочитаешь нижнюю часть моих вопросов, там написано, что я пробовал 9600 бод. К сожалению, никакой разницы., @GreatHam
почему вы считаете, что данные будут доступны без пробелов?, @Juraj
Как ни странно, я могу отправлять данные из ESP в Arduino двумя отдельными вызовами write() и при этом получать их целиком на стороне Arduino. Но даже если я отправлю данные в один буфер наоборот, ESP получит только первый символ. Разве вызовы Serial.available() не должны позаботиться о любых пробелах в данных? Или вы имеете в виду совсем другое?, @GreatHam
Serial.available()
возвращает количество байтов в буфере RX. но на скорости 9600 бод байты поступают очень медленно, @Jurajвы можете использовать функции блокировки readString или readBytes, но лучше знать символ терминатора. https://www.arduino.cc/reference/en/language/functions/communication/serial/, @Juraj