Модули 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", произошло то же самое. Любая помощь будет оценена.
@Gxs1619, 👍1
Обсуждение3 ответа
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
Вам следует изменить контакты TX и RX на плате Arduino и подключить их к другому контакту, отличному от TXD и RXD, поскольку это аппаратные контакты...
ОП говорит, что они используют 10 и 11., @Code Gorilla
«Иногда вы получаете 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 Таблица
- AT-команды не работают для HC-06 НА ARDUINO UNO
- Как заставить Arduino печатать на Arduino IDE моего Mac через Bluetooth?
- Bluetooth-модуль HC-05 неправильно считывает данные с моего телефона Android
- Сканирование Bluetooth-устройств с помощью HC-05
- Мой модуль Bluetooth HC-05 не работает
- Проблемы с использованием модуля Bluetooth HC-06 с Arduino
- Модуль HC-05 не получает команд и не спаривается
- Проблемы с подключением Bluetooth OBD2 ELM327
ОБНОВЛЕНИЕ: Я изменил «100» на «hello», и теперь я получаю такие значения, как 104, 101, 111, 108. Я где-то читал, что байты могут путаться из-за того, насколько длинна или коротка задержка., @Gxs1619
49 — десятичное значение ASCII строки
1
.... 48 — десятичное значение ASCII строки0
.... 104=h
, 101=e, 108=
l` и т.д. и т.п. ........... http://www.asciichart.com/ascii_decimal.html, @jsotolaДумаю, я не смогу отправлять строки по Bluetooth., @Gxs1619
вы уже это делаете, передаваемые данные всегда являются двоичным значением, которое имеет десятичный эквивалент и эквивалент ASCII ..... просто преобразуйте значения ASCII в строку .... во многих местах в Интернете показано, как это сделать, @jsotola