Arduino: использование Serial и программного обеспечения Serial с модулем bluetooth

Моя цель - использовать ******* для установления связи между ПК и Android-устройством с помощью модуля bluetooth HC-05.

Я использую USB-связь между ПК и ******* (Serial Monitor) и SoftwareSerial для подключения к HC-05.

Моя проблема в том, что связь хорошо работает с BT на ПК, но не работает должным образом по-другому. При отправке с ПК на BT все отправленные символы принимаются устройством BT только при закрытии последовательного монитора на ПК или когда я reset *******.

Я исключил проблему с BT-модулем или Android-приложением, потому что если в ******* я реализую код ECHO (напишите на Android и отправьте на Android), все будет хорошо.

С приведенным ниже кодом ******* ожидаемое поведение: ******* reset → Hello word sent, Serial monitor open- > ничего не происходит, символ, записанный на последовательном мониторе- > символ, полученный на BT, символ, написанный на BT- > символ, полученный на Serial Monitor, Последовательный монитор закрыт- > ничего не происходит.

Реальное поведение: ******* reset → Hello word sent, Serial monitor open- > 2 Привет, слово BT и 1 ( "goodnight" ) на ПК, символ, записанный на последовательном мониторе, → ничего, символ, написанный на BT- > , полученный на Serial Monitor, последовательный монитор закрыт- > предыдущий записанный символ в последовательном мониторе, полученный + Hello Word.

Как я могу исправить эту проблему?

код:

#include <softwareserial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int a=0;
char c;
char d;
void setup() {
 Serial.begin(9600);
 Serial.println("Goodnight moon!");
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
}
void loop() {
 delay(10);
 if (Serial.available()) {
 c=Serial.read();
 delay(10);
 Serial.write(c);
 }
 delay(10);
 if (mySerial.available()) {
 d=mySerial.read();
 delay(10);
 mySerial.write(d);
 }
}
</softwareserial.h>
6 ответов

Этот код работает для меня на ******* Mini Pro (должен быть такой же, как UNO) с HC-05. У меня есть HC-05 в паре с моим ноутбуком. Используя HyperTerminal на COM-порту, связанном с HC-05 и последовательной консолью *******, я могу отправлять сообщения двунаправленно. Операторы Serial.println отображаются в окне Hyperterminal, как и должны.

#include <softwareserial.h>
#define rxPin 8
#define txPin 7
SoftwareSerial mySerial(rxPin, txPin); // RX, TX
char myChar ; 
void setup() {
 Serial.begin(9600); 
 Serial.println("Goodnight moon!");
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
}
void loop(){
 while(mySerial.available()){
 myChar = mySerial.read();
 Serial.print(myChar);
 }
 while(Serial.available()){
 myChar = Serial.read();
 mySerial.print(myChar);
 }
}
</softwareserial.h>


Я реализовал последовательную связь между ******* Uno и ПК, и это был мой код, надеюсь, что он может помочь:

int data;
char character;
int start_flag = 0;
void setup() {
 Serial.begin(921600); 
 pinMode(2, OUTPUT); 
}
void loop() {
 if(Serial.available() > 0){
 character = (char) Serial.read();
 if(character == 's') {
 start_flag = 1;
 }
 if(character == 't') {
 start_flag = 0;
 }
 }
 if (start_flag == 1) {
 Serial.print(data); //data that was acquired by internal ADC
 }
}


Я рекомендую использовать это приложение для тестирования:

https://play.google.com/store/apps/details?id=com.vagoscorp.virtualterminal

Это позволяет вам видеть и отправлять байты в виде байтов (число от 0b00000000 до 0b11111111 (от 0 до 255 в десятичном формате)) так что вы можете сделать простую прошивку эха, чтобы проверить, правильно ли работает скорость передачи данных, и с этой работой начинайте отправлять команды для включения/выключения некоторых светодиодов.

это пример кода эха:

char dato = 0;
void setup() {
 Serial.begin(9600);//9600 is the default baudrate of the HC-05 (you can change it by AT commands, google it if you want)
 //pinMode(13, OUTPUT); //enable this pin if you want to use de LED idea
 //digitalWrite(13, HIGH);
}
//////////////////////////////////////////////////////////////////////////
void serialEvent() { //if you have received serial data
 while (Serial.available() > 0) {
 char dato = (byte)Serial.read();//save the byte
 Serial.write(dato);//send the just received byte (echo)
 }
}
///////////////////////////////////////////////////////////////////////////
void loop() {
}

Я надеюсь, что это поможет вам


Если у вас такая же проблема, вам нужно просмотреть модуль BT как 2 разных скорости передачи на проводной стороне и на радио. Радиостанция устанавливается через все, что вы подключаете через шпатлевку, проводная сторона запрограммирована с помощью AT-команд. HC-05 по умолчанию - 38400.


Используйте эту последовательную настройку. С помощью этого кода я могу получать и отправлять дату на bluetooth из Serial Monitor

void setup(){
 Serial.begin(9600); // Begin the serial monitor at 9600bps
 bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps
 bluetooth.print("$"); // Print three times individually
 bluetooth.print("$");
 bluetooth.print("$"); // Enter command mode
 delay(100); // Short delay, wait for the Mate to send back CMD
 bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity
 // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
 bluetooth.begin(9600); // Start bluetooth serial at 9600
 pinMode(led, OUTPUT);
 pinMode(buttonPin1, INPUT);
 pinMode(buttonPin2, INPUT);
}

Для получения дополнительной информации посетите http://www.circuitmagic.com/*******/*******-and-bluetooth-hc-06-to-control-the-led-with-android-device/


Вы можете попробовать this. Это про простейший код, который вы можете использовать при тестировании связи Bluetooth-коммуникатора ******* ↔ С#. Примечание: код был протестирован путем подключения PIN1 (TX) ↔ MODULE RX, PIN2 (RX) ↔ MODULE TX и деления PIN1 (TX) 5V на 2,5V перед подачей его в модуль.

Надеюсь, это поможет всем, кто это пытается!

licensed under cc by-sa 3.0 with attribution.