[Gelöst] HC-05 Bluetooth Modul reagiert nicht auf AT commands

Bin immer noch neu in der Arduino Geschichte... hab so einige Tutorials durchsucht aber iwie will mein Modul keine AT Commands annehmen oder einfach nicht antworten... oder ich lese falsch aus.. kp.
Ich hab das ZS-040 Modul bei dem man den kleinen switch drücken muss wenn man VCC anschließt. Danach blinkt die LED langsam wie es auch sein sollte. Heißt ich müsste im Command-Mode sein.
Nur kann ich keine Antwort auslesen.
Hier mal den Code:

#include <SoftwareSerial.h>

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

void setup()
{	
	Serial.begin(9600);
	while (!Serial) { ; } 	
	mySerial.begin(9600); //Maximal: 1382400
	Serial.println("Setup Fertig!");
}

void loop(){ 

	if (mySerial.available()){//Prüfe ob Daten zum Lesen anstehen
		Serial.print("Daten stehen an! Lese Daten: ");
		String a = "";
		while (mySerial.available())
			a += (char)mySerial.read();//mySerial.readString() ist auch eine Möglichkeit um einen string zu lesen dauert aber länger					
		Serial.println(a);  	
	}
	
	Serial.println("Sende Daten");
	if ((mySerial.println("AT+STATE?\r\n") > 0))
		Serial.println("Daten gesendet");
	
	delay(1000);
}

Es wird die ganze Zeit "Sende Daten" und "Daten gesendet" in meiner Console ausgegeben. Also Daten werden wohl gesendet.
Nur nachdem die Daten gesendet wurde sollten doch eigentlich auch Daten zum Lesen anstehen wenn das HC-05 geantwortet hat? Es scheint aber dass mySerial.available() nie größer 0 zurück gibt sondern immer nur -1.
Wenn ich nicht im Command Mode bin und etwas mit meinem Handy über die Android App "Bluetooth Terminal" eingebe dann wird es mir auch in der Arduino IDE Console angezeigt.
Sieht einer was ich falsch mache?

Edit:
Gelöst :slight_smile: Danke nochmal an alle hier. Hab hier nochmal den Code der funktioniert (bei mir jetzt zumindest ;)):

#include <SoftwareSerial.h>

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

void setup()
{ 
 Serial.begin(9600);
 while (!Serial) { ; } 
 mySerial.begin(38400); //Maximal: 1382400 //WICHTIG! => 38400 für CommandMode sonst geht nix! + Switch drücken beim Anschalten bzw. Pin 34 auf 3.3v setzen
 Serial.println("Setup Fertig!");
}
int z = 0;
void loop(){ 

 if (mySerial.available()){//Prüfe ob Daten zum Lesen anstehen
 Serial.print("Daten stehen an! Lese Daten: ");
 String a = "";
 while (mySerial.available()){
 a += (char)mySerial.read();//mySerial.readString() ist auch eine Möglichkeit um einen string zu lesen dauert aber länger 
 }
 Serial.println(a);
 }
 Serial.println(mySerial.read());
 Serial.println("Sende Daten");
 if ((mySerial.print("AT+STATE?\r\n") > 0))
 Serial.println("Daten gesendet");
 delay(1000);
}

Hallo,

ich gehe davon aus das es zum HC-05 kompatibel ist.
für den Kommando Modus ist notwendig:
a) Keypin auf High
b) Baudrate 38400
c) 'AT' senden
d) LF und/oder CR muß mit dem Befehl gesendet werden

Edit:
nach ZS-040 gegoogelt ...
http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/

HC-05_pdf.zip (690 KB)

Du unterschätzt auch wie langsam Serial ist und wie schnell der µC ist. Das ist keine blockierende Schleife:

while (mySerial.available())

Das liest ein Zeichen ein und liefert dann false weil das nächste Zeichen noch unterwegs ist.

Danke für die Antworten und die Dokumente zum HC05.
Als erstes habe ich nun mal die Baudrate auf 38400 gesetzt und siehe da wenn ich VCC weg nehme, switch drücke, VCC wieder anschließe dann wird mir einmal auf "At+STATE?\r\n" geantwortet. :slight_smile:
Allerdings eben nur einmal :frowning: Ich sende es ja eigentlich jede Sekunde und müsste doch ca. jede Sekunde eine Antwort bekommen oder nicht?
Außerdem lässt sich nur ein einziger Command senden. Sende ich mehrere hintereinander werden nach dem ersten die folgenden Commands einfach ignoriert. Liegt das an "\r\n"?

Zu meiner Schleife. Ok das wusste ich nicht. Allerdings hat es komischerweise bisher funktioniert und ich konnte mir auf diese Weise strings zusammenbauen und ausgeben lasen. Macht vielleicht read() schon automatisch eine kleine delay rein?

Hallo,

den Link und dessen Bsp. Code schon angeschaut?
Dabei wird das angesprochene Problem von Serenifly behoben.
Nicht nur wild rum spielen, auch lesen ... auch wenn es manchmal schwer fällt. :wink:

Ich lese so ein

char receive[50]; // länge des Char arrays anpassen, um Platz zu sparen 
int index=0;
void loop() {

while (Serial.available())
 {	  char c=Serial.read();
           
            receive[index]=c;                    
		      index++;
           
            else if (c=='\n')  // Ende Zeichen nach bedarf ändern   
                       {
    		    receive[index]='\0';
                        index=0;
                              }
           
           
}

Du hast das Ergebnis dann im receive Char Array.

@ Doc_Arduino
Ja.. ist eins meiner tutorials :).. aber hast recht genauer lesen ist schon nicht schlecht^^... da war das mit der Baudrate auch drin.. sry :S
K. Hab den Fehler warum es nur einmal geantwortet hat.

if ((mySerial.println("AT+STATE?\r\n") > 0))

Hab aus alten Test da immer noch das "ln" an print() dan gehabt.
Jetzt gehts

#include <SoftwareSerial.h>

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

void setup()
{ 
 Serial.begin(9600);
 while (!Serial) { ; } 
 mySerial.begin(38400); //Maximal: 1382400 //WICHTIG! => 38400 für CommandMode sonst geht nix!
 Serial.println("Setup Fertig!");
}
int z = 0;
void loop(){ 

 if (mySerial.available()){//Prüfe ob Daten zum Lesen anstehen
 Serial.print("Daten stehen an! Lese Daten: ");
 String a = "";
 while (mySerial.available()){
 a += (char)mySerial.read();//mySerial.readString() ist auch eine Möglichkeit um einen string zu lesen dauert aber länger 
 }
 Serial.println(a);
 }
 Serial.println(mySerial.read());
 Serial.println("Sende Daten");
 if ((mySerial.print("AT+STATE?\r\n") > 0))
 Serial.println("Daten gesendet");
 delay(1000);
}

Problem hat sich somit erledigt. Danke an alle hier :slight_smile: