Добрый день форумчане!
Очередной вопрос от новичка про обмена данными по программному серийному порту.
Платы Уно и Нано. Уно - ОТПРАВИТЕЛЬ. Нано - приемник.
Загружаем следующие скетчи (естественно нашел примеры в инете, немного допилил)
Отправитель
// Пример отправки и приёма структуры через 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 (извиняйте, если плаваю в терминологии), не использовал, т.к. хочу именно сделать обмен через программный порт.
Результат стабильно плохой
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.
Спасибо за конструктивные подсказки!