webentwicklung-frage-antwort-db.com.de

Arduino: Verwenden von Serial und Software Serial mit Bluetooth-Modul

Ich möchte Arduino verwenden, um die Kommunikation zwischen einem PC und einem Android-Gerät mithilfe eines HC-05-Bluetooth-Moduls einzurichten.

Ich verwende die USB-Kommunikation zwischen dem PC und dem Arduino (Serial Monitor) und eine SoftwareSerial, um eine Verbindung zum HC-05 herzustellen.

Mein Problem ist, dass die Kommunikation von BT zum PC gut funktioniert, auf andere Weise jedoch nicht wie erwartet. Beim Senden vom PC an BT werden alle gesendeten Zeichen nur dann vom BT-Gerät empfangen, wenn ich den Serial Monitor am PC schließe oder das Arduino zurücksetze.

Ich habe ein Problem mit dem BT-Modul oder der Android-Anwendung ausgeschlossen, da in Arduino ein ECHO-Code (in Android schreiben und in Android senden) alles gut funktioniert.

Mit dem unten angegebenen Arduino-Code lautet das erwartete Verhalten: Arduino reset-> Hello Word wurde gesendet, Serial Monitor wurde geöffnet. -> nichts passiert, Zeichen geschrieben auf seriellem Monitor-> Zeichen auf BT empfangen, Zeichen auf BT-> Zeichen auf Serial Monitor empfangen , Serial Monitor geschlossen -> nichts passiert.

Das eigentliche Verhalten ist: Arduino reset-> Hello Word gesendet, Serial Monitor geöffnet-> 2 Hello Word auf BT und 1 ("goodnight") auf PC, Zeichen auf seriellem Monitor geschrieben -> nichts, Zeichen auf BT-> Zeichen empfangen auf dem seriellen Monitor wurde der serielle Monitor geschlossen -> zuvor geschriebene Zeichen im seriellen Monitor empfangen + Hallo Wort.

Wie kann ich dieses Problem beheben?

Code:

#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);

  }
}
6
user2706612

Ich habe eine serielle Kommunikation zwischen Arduino Uno und PC implementiert. Dies war mein Code. Ich hoffe, er kann helfen:

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
  }
}
2
STiLLeN

Dieser Code funktioniert für mich auf einem Arduino Mini Pro (sollte mit UNO identisch sein) mit einem HC-05. Ich habe die HC-05 mit meinem Laptop gekoppelt. Mit HyperTerminal am COM-Port des HC-05 und der seriellen Arduino-Konsole kann ich Nachrichten bidirektional senden. Die Serial.println-Anweisungen werden im Hyperterminal-Fenster angezeigt, wie sie sollten.

#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);
  }
}
2
imjosh

Verwenden Sie dieses serielle Setup. Mit diesem Code kann ich vom seriellen Monitor ein Datum empfangen und an Bluetooth senden

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);
}

Weitere Informationen finden Sie unter http://www.circuitmagic.com/arduino/arduino-und-bluetooth-hc-06-to-control-the-led-mit-Android-device/

0
Mandy

Du könntest dies versuchen. Es handelt sich dabei um den einfachsten Code, den Sie beim Testen der Arduino Bluetooth <-> C # -Kommunikation verwenden können. Hinweis: Der Code wurde getestet, indem PIN1 (TX) <-> MODUL RX, PIN2 (RX) <-> MODUL TX angeschlossen und der PIN1 (TX) 5V auf 2,5V aufgeteilt wurde, bevor er dem Modul zugeführt wurde.

Hoffe, das hilft allen, die das versuchen!

0
jaolho

Hatte das gleiche Problem, müssen Sie das BT-Modul als 2 verschiedene Baudraten auf der verdrahteten und der Funkseite betrachten. Die Funkseite wird durch das festgelegt, was Sie über PuTTY verbinden, die kabelgebundene Seite wird mit den Befehlen AT programmiert. HC-05 ist bei 38400 voreingestellt.

0
Davee

Ich empfehle, diese App zum Testen zu verwenden:

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

Sie können Bytes als Bytes anzeigen und senden (Zahl von 0b00000000 bis 0b11111111 (0 bis 255 in Dezimalzahl)) . Sie können eine einfache Echo-Firmware erstellen, um zu testen, ob Ihre Baudrate korrekt ist Befehle zum Ein- und Ausschalten einiger LEDs

dies ist ein Echo-Code-Beispiel:

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() {

}

Ich hoffe es hilft dir

0
Sebasu