ARDUINO 2xHC-05 проблемы с Serial

dpe

✩✩✩✩✩✩✩
14 Сен 2023
5
0
Есть две Arduino, одна Iskra Mega + HC-05 в режиме мастер, вторая Iskra Leonardo + HC-05 в режиме слейв.
При передаче через Bluetooth по Softserial от Mega к Leonardo принимающая сторона получает бред.

Скетч Mega (отправитель)
Код:
#define PN_BRIDGE_BT_TX 18
#define PN_BRIDGE_BT_RX 19
#include <SoftwareSerial.h>
SoftwareSerial Serial22(PN_BRIDGE_BT_RX, PN_BRIDGE_BT_TX);

void setup()
{
  pinMode(PN_BRIDGE_BT_RX, INPUT);
  pinMode(PN_BRIDGE_BT_TX, OUTPUT);
  Serial.begin(9600);
  Serial.println("Arduino is ready");
  Serial22.begin(9600);
  Serial.println("Bluetooth is ready");
}
void loop()
{
  Serial22.print("0,45;");
  Serial.println("0,45;");
  delay(2000);
  Serial22.print("0,90;");
  Serial.println("0,90;");
  delay(2000);
  Serial22.print("0,180;");
  Serial.println("0,180;");
  delay(2000);
}
Скетч Leonardo (получатель)
Код:
#define PN_BT_TX 10
#define PN_BT_RX 11
#define PIN_SERVO 8
#include <SoftwareSerial.h>
#include <Servo.h>
#include <GParser.h>
#include <parseUtils.h>
#include <unicode.h>
#include <url.h>
int ang = 0;
Servo srv;
SoftwareSerial BT_Serial(PN_BT_RX, PN_BT_TX);
void setup()
{
  pinMode(PN_BT_RX, INPUT);
  pinMode(PN_BT_TX, OUTPUT);
  pinMode(PIN_SERVO, OUTPUT);
  srv.attach(PIN_SERVO);
  Serial.begin(9600);
  BT_Serial.begin(9600);
  pinMode(13, OUTPUT);
}
void loop()
{
if(BT_Serial.available())
{
  char buf[50];
  int num = BT_Serial.readBytesUntil(';', buf, 50);
 
  buf[num] = NULL;
  GParser data(buf, ',');
  int ints[10];
  data.parseInts(ints);
  switch (ints[0])
  {
    case 0:
    srv.write(ints[1]);
    Serial.print("1st;");
    Serial.print(num);
    Serial.print(",");
    Serial.print(ints[0]);
    Serial.print(",");
    Serial.println(ints[1]);
    break;
    case 1:
    Serial.println("one");
    break;
  }
}
}
wkoWu1IGzN.png

Скорости обеих YC-05 одинаковые, настроены через терминальные команды.
Пробовал подключаться к Leonardo через смартфон, посылал команды из терминала - отрабатывает все правильно. Получается проблема в отправителе. А вот в в чем проблема - не могу понять.

Буду весьма признателен за помощь.
 

dpe

✩✩✩✩✩✩✩
14 Сен 2023
5
0
Нашел что у меги на 18 и 19 встроенный Serial1, теперь мега без Softwareserial, но проблема не решилась.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@dpe, вообще-то, при отправке данных, которые не предназначены для вывода на дисплей по Serial, обычно используют функцию Serial.write(), а не Serial.print().
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
465
134
@dpe,
у леонардо тоже есть serial1
Проверьте сначала просто вывод того, что получили, без парсинга.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,968
632
44
Вы попробуйте для начала без всяких GParser, что из БТ приходит то и печатайте.
 

dpe

✩✩✩✩✩✩✩
14 Сен 2023
5
0
@Bruzzer,
@Геннадий П,
без парсинга такой же мусор - квадратики


почему-то проблемы именно со встроенным в мегу Serial1-3. Если на меге повесить Softwareserial на 8-9 ноги, то все работает и передает все четко.
 

dpe

✩✩✩✩✩✩✩
14 Сен 2023
5
0
Нашел решение от мусора в Serial на Iskra Mega, но думаю что и на любой другой мега будет то же самое.
В setup() нужно вставить.
Код:
void setup()
{
digitalWrite( 19, HIGH ); // fix Serial1
digitalWrite( 17, HIGH ); // fix Serial2
digitalWrite( 15, HIGH ); // fix Serial3
...
}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Работать будет, но по идее должна быть аппаратная подтяжка для хардварного уарта, поэтому и спросил, т.к. на меге (не искре) такого не замечал.