Плохо отформатированные символы с использованием Bluetooth-модуля JDY-30

У меня есть Bluetooth-модуль JDY-30, и он подключен следующим образом (за исключением использования Arduino Uno):

Он работает, но мне нужно использовать его со скоростью 115200 бод вместо стандартной 9600. У меня тоже так работает. Вот код:

#include <SoftwareSerial.h>

SoftwareSerial mySerial (2, 3); // RX, TX

// state | RXD | TXD | GND | VCC | EN

void setup () {
  mySerial.begin(115200);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
}

void loop() {

  while (mySerial.available()) {
    delay(10);
    Serial.write(mySerial.read());
    delay(10);
  }
  
  while (Serial.available()) {
    mySerial.write(Serial.read());
  }

}

Но когда я что-то печатаю, я часто получаю плохо отформатированные символы.

Некоторые примеры:

16:32:33.212 --> +VERSION=Прошивка V3.0.6,Bluetooth V4.0 L⸮

16:32:38,990 -> +VERSION=Прошивка V3.0.6,Bluetooth V4.0 LE

подробнее:

16:33:27.144 --> +NAME=CC61-A

16:33:30.054 --> +NAME=CC41-A

Если я также использую скорость 115200 бод для Arduino, тогда все становится еще хуже.

Есть ли решение для этого?

Подробнее о JDY-30 см. здесь: http://myosuploads3.banggood.com/products/20181203/20181203214419JDY-30- SPP-Bluetooth-Module.pdf

, 👍-1

Обсуждение

Невозможно надежно получить с помощью SoftwareSerial на скорости 115200 бод. UNO слишком медленная для этого., @Majenko

Кроме того, логика 3,3 В модуля Bluetooth находится прямо на ВЫСОКОМ пороге логики 5 В Arduino. Существует небольшой предел для ошибки, что делает его очень подверженным шуму., @Majenko

@ Маженко, как насчет письма, это надежно? Меня не так волнует чтение., @clankill3r

Писать хорошо, да. В этой ситуации Arduino контролирует поток, поэтому скорость менее критична., @Majenko


1 ответ


0

Как отметил @Majenko:

Невозможно надежно получить с помощью SoftwareSerial на 115200 бод. UNO слишком медленный для этого.

Я получил результаты, которые были намного лучше, если сначала создать строку при чтении, а затем, когда у нас есть строка, отправить ее. Вместо того, чтобы отправлять то, что мы читаем все время. Например, когда я попробовал AT+VERSION сейчас, мне потребовалось 16 попыток, чтобы получить неверный ответ, и только один символ из 42 был неверным в тот раз.

#include <SoftwareSerial.h>

SoftwareSerial mySerial (2, 3); // RX, TX

// state | RXD | TXD | GND | VCC | EN

void setup () {
  mySerial.begin(115200);
  Serial.begin(115200);
  Serial.println("Enter AT commands:");
}

void loop() {

  String input_string = "";

  while (mySerial.available()) {
    input_string += (char)mySerial.read();
  }

  if (input_string != "") {
    Serial.write(input_string.c_str());
  }

  while (Serial.available()) {
    mySerial.write(Serial.read());
  }

}
,