Модули Bluetooth не взаимодействуют правильно

Я подключаю BT rx к цифровому 11, BT tx к цифровому 10, а затем 5 В и заземление от HC-05 к arduino. Затем я загружаю этот код в HC-05, который установлен как мастер.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  Serial.begin(57600);
  mySerial.begin(9600);
}

void loop() { // запускать снова и снова
  Serial.println(mySerial.read());
  delay(2000);
}

Затем я загружаю этот код в Arduino с HC-05, который установлен как ведомое устройство:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11); // RX , TX


void setup() {
  // put your setup code here, to run once:
  mySerial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  mySerial.write("100");
  delay(2000);
}

Проблема в том, что я никогда не получаю "100" на последовательном мониторе, я получаю только 49 и иногда 48. Когда я изменил его со "100" на "10", произошло то же самое. Любая помощь будет оценена.

, 👍1


3 ответа


1

SoftwareSerial.read() возвращает один символ как целое число. Когда вы печатаете целое число, функции print() преобразуют его в удобочитаемый для человека формат.

Вы хотите преобразовать (привести) вывод read() в тип char. Либо:

void loop() {
  char c;
  c = mySerial.read(); // сохраняем результат во временной переменной c
  Serial.println(c);
  delay(2000);
}

или

void loop() {
  Serial.println((char)mySerial.read()); // перед печатью преобразуем тип в char.
  delay(2000);
}    

Однако, поскольку за раз считывается только один символ, ваш вывод будет состоять из одного символа на строку (при условии отсутствия потери данных из-за задержки):

1
0
0
,

-1

Вам следует изменить контакты TX и RX на плате Arduino и подключить их к другому контакту, отличному от TXD и RXD, поскольку это аппаратные контакты...

,

1

«Иногда вы получаете 49 и 48»?

Я ожидаю, что вы получите 49, 48, 48, 49, 48, 48 ...

49 — это «1» в ASCII, и угадайте, что означает 48 :)

Это потому, что вы пишете и читаете байты, а не символы. Есть очень тонкая разница.

Поменяйте приемник на этот, и это будет иметь больше смысла.

void loop() { // запускать снова и снова
  const char letter = (char)mySerial.read(); // Превращаем байт в букву ASCII.
  Serial.println(letter);
  delay(2000);
}

Все еще может пойти не так, если вы читаете <32 или >126, но ...

Вот таблица ASCII, которая поможет: ASCII Таблица

,