UART Связка Уно - Нано работает, Уно - Node-MCU-ESP8266 нет

Добрый день форумчане!
Очередной вопрос от новичка про обмена данными по программному серийному порту.
Платы Уно и Нано. Уно - ОТПРАВИТЕЛЬ. Нано - приемник.
Загружаем следующие скетчи (естественно нашел примеры в инете, немного допилил)

Отправитель

// Пример отправки и приёма структуры через Serial
// ОТПРАВИТЕЛЬ
// Ардуины соединены так:
// отправитель D11 -> приёмник D10
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
struct Str {
  float val_f;
  long val_l;
  int val_i;
  byte val_b;
};
void setup() {
  Serial.begin(9600);
  mySerial.begin(4000);
  Serial.println("Стартовала плата ОТПРАВИТЕЛЬ.");
}
void loop() {
  // буфер на отправку
  Str buf;
  // заполняем
  buf.val_b = 123;
  buf.val_i = 12345;
  buf.val_l = 123456;
  buf.val_f = 123.456;
  // отправляем родным write()
  // указываем ему буфер-структуру, но приводим тип к byte*
  // размер можно указать через sizeof()
  mySerial.write((byte*)&buf, sizeof(buf));
  delay(2000);
}

Приемник

// Пример отправки и приёма структуры через Serial
// ПРИЁМНИК
// Ардуины соединены так:
// приёмник D10 -> отправитель D11
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
// структура для приёма
// должна соответствовать отправляемой
// esp 8266 NodeMcu v3
int in_x = 0;

struct Str {
  float val_f;
  long val_l;
  int val_i;
  byte val_b;
};
// создаём саму структуру
Str buf;
void setup() {
  Serial.begin(9600);
  mySerial.begin(4000);
  Serial.println("Стартовала плата ПРИЕМНИК.");
}
void loop() {
  // читаем родным методом readBytes()
  // указываем ему буфер-структуру, но приводим тип к byte*
  // размер можно указать через sizeof()

  if (mySerial.available() > 0)
  {
    mySerial.readBytes((byte*)&buf, sizeof(buf));
    Serial.println("Приняли структуру:");
    Serial.println(buf.val_b);
    Serial.println(buf.val_i);
    Serial.println(buf.val_l);
    Serial.println(buf.val_f, 3);
    in_x = buf.val_i;
    Serial.print("Из структуры вытащили переменную val_i (целое): ");
    Serial.println(in_x);
  }
  else
  {
    Serial.println("Пока буфер пуст.");
  }

  delay(500);

}

Все замечательно работает, вот что выводится на экран от ПРИЕМНИКА
21:15:14.030 → ��Стартовала плата ПРИЕМНИК.
21:15:20.748 → Пока буфер пуст.
21:15:21.234 → Пока буфер пуст.
21:15:21.781 → Пока буфер пуст.
21:15:22.277 → Приняли структуру:
21:15:22.317 → 123
21:15:22.317 → 12345
21:15:22.317 → 123456
21:15:22.317 → 123.456
21:15:22.317 → Из структуры вытащили переменную val_i (целое): 12345
21:15:22.882 → Пока буфер пуст.
21:15:23.376 → Пока буфер пуст.
21:15:23.871 → Пока буфер пуст.
21:15:24.395 → Приняли структуру:
21:15:24.395 → 123
21:15:24.395 → 12345
21:15:24.395 → 123456
21:15:24.395 → 123.456
21:15:24.429 → Из структуры вытащили переменную val_i (целое): 12345
21:15:25.004 → Пока буфер пуст.
21:15:25.458 → Пока буфер пуст.
21:15:25.959 → Пока буфер пуст.

Далее, Уно все так же ОТПРАВИТЕЛЬ, пины те же 10 11.
но вместо Нано Приемником цепляем Node-MCU-ESP8266.
Для Node-MCU-ESP8266, чуть забегая вперед пробовал в
SoftwareSerial mySerial(RX, TX);
подставлять следующие пары 2 3, 4 5, 5 6, 7 8 (в разных постах в инете пишут разное).
0 1, т.е. “настоящие” Rx Tx (извиняйте, если плаваю в терминологии), не использовал, т.к. хочу именно сделать обмен через программный порт.
Результат стабильно плохой :frowning:
21:20:45.681 → �HA�t�C�d� x|HH�T��`���ihp�9�Стартовала плата ПРИЕМНИК.
21:20:45.840 → Пока буфер пуст.
21:20:46.307 → Пока буфер пуст.
21:20:46.807 → Пока буфер пуст.
21:20:47.340 → Пока буфер пуст.

Пробовал менять скорость на 115200 (в двух модулях и в серийном, и в программном порту), но это не помогло, вернулся к скорости, которая была указана в примере.
Serial.begin(9600);
mySerial.begin(4000);

На связке Уно → Нано, все работает прекрасно.
Уно → Node-MCU-ESP8266, никак не хочет.
С “железом” я не очень дружу, видимо что то не понимаю в настройке Node-MCU-ESP8266.

Спасибо за конструктивные подсказки! :slight_smile:

Скорости приемника и передатчика должны быть одинаковыми. Почему у вас разные?

И покажите фото платы 8266…

И код (полный) для 8266 тоже.

mySerial.begin (4000) в обоих случаях.
Или необходимо так же что бы совпадало и в стандартном Serial?
Поправлю. Лучше какую скорость выставить? 9600?

Код для 8266 это и есть код Приемника, без изменений, за исключением перебора
в SoftwareSerial mySerial(10, 11); // RX, TX
Пробовал пары 2 3, 4 5, 5 6, 7 8, ничего не помогло, фото сейчас будет.

Да, забыл написать, платы соединяю кроссом, т.е. Rx в Tx и наоборот.

Поставил везде скорость 9600.
И в серийном, и в программном портах, в обоих модулях (Прием , Передача).
Результат точно такой же.
Уно → Нано . Получаем данные.
Уно → Node-MCU-ESP8266. Буфер пуст.

Я говорил о сериал, через которые общаются платы.

Тогда ещё нужна схема, куда вы подключали rx-tx, в зависимости от кода. Скорее всего, просто мимо.

А почему?

Что бы не гадать, везде поставил 9600, результат тот же.

(И в Serial и в mySerial.
В обоих модулях).

Схему завтра выложу.
Про rx, tx. Как я понимаю, возможно неправильно, но что бы не было пересечения с выводом сообщений на монитор.
Во всех примерах, которые мне попадались, не рекомендовали использовать rx tx встроенные.
Встроенные, обычно, только в примерах для демонстрации пересылки текстовых строк типа Hello, world!
Как только пример с передачей реальных данных, сразу же переход на программный порт.

Но завтра попробую с ними.

Стандартный софтсериал на есп не работает. Basic/libraries/espsoftwareserial at master · esp8266/Basic · GitHub

1 лайк

Спасибо! Думаю, что это то что надо, но не заработало пока. :frowning:

Похоже сжег что то в Node-MCU-ESP8266 во время многочисленных попыток соединений.
Скоро с али придет посылка с новым модулем, буду дальше пробовать.
Но почти уверен, это правильное решение.

D4 и D5 не равно 4 и 5 в Ардуино IDE. Погуглите соответствие пинов. (Не могу вставить сейчас ссылку)

1 лайк

Намек понял. :slight_smile: Поищу обязательно.
Вы не вот эту картинку имеете ввиду?

6d991cb6-5660-4f15-b334-2f72b8752e01

Пойдет и эта. Соответственно, у вас это 2 и 14

1 лайк

Вот это поворот! :slight_smile:
К сожалению, прямо сейчас не могу проверить, немного позже, но как говорится “Век живи, век учись!”
И “Не верь глазам своим!”

**ВСЕ ЗАРАБОТАЛО. Спасибо! **

Вот рабочий код. и ниже будет схема.

// Пример отправки и приёма структуры через Serial
// ПРИЁМНИК
// Ардуины соединены так:
// приёмник D10 -> отправитель D11
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5); // RX, TX
// структура для приёма
// должна соответствовать отправляемой
// esp 8266 NodeMcu v3
int in_x = 0;

struct Str {
  float val_f;
  long val_l;
  int val_i;
  byte val_b;
};
// создаём саму структуру
Str buf;
void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("Стартовала плата ПРИЕМНИК.");
}
void loop() {
  // читаем родным методом readBytes()
  // указываем ему буфер-структуру, но приводим тип к byte*
  // размер можно указать через sizeof()

  if (mySerial.available() > 0)
  {
    mySerial.readBytes((byte*)&buf, sizeof(buf));
    Serial.println("Приняли структуру:");
    Serial.println(buf.val_b);
    Serial.println(buf.val_i);
    Serial.println(buf.val_l);
    Serial.println(buf.val_f, 3);
    in_x = buf.val_i;
    Serial.print("Из структуры вытащили переменную val_i (целое): ");
    Serial.println(in_x);
  }
  else
  {
    Serial.println("Пока буфер пуст.");
  }

  delay(500);

}

Сделал на D2, D1 это соответственно картинки пины 4 и 5

Остался факультативный вопрос. Поставил библиотеку через “Добавить Zip библиотеку”, библиотека встала, все ОК.
Но если посмотреть на файлы в библиотеке, то видим, что каталог называется
…Scetchs\libraries\EspSoftwareSerial
но сама библиотека имеет тоже имя SoftwareSerial.h.

Поэтому в коде продолжаю писать
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5); // RX, TX

Видимо сам IDE понимает, какую библиотеку подхватывать,
стандартную SoftwareSerial.h или
SoftwareSerial.h из …Scetchs\libraries\EspSoftwareSerial, в тот момент, когда я в IDE указываю плату, с которой сейчас работаю.

Это так?

Да. В библиотеках есть опции, которые указывают с каким МК они работают.

1 лайк