Проблемы с последовательной связью между 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.

, 👍0

Обсуждение

используйте 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


1 ответ


Лучший ответ:

0

Причина проблемы заключалась в том, что ESP слишком быстро считывал char, а это означало, что он прекращал работу до того, как следующий char мог быть отправлен с Arduino. Чтобы решить эту проблему, я просто добавил задержку в 10 мс между каждым вызовом Serial.read() в ESP.

,