问题描述
作为介绍,我给自己买了一个arduino和一些模块来学习一些软件知识。该项目最终将连接到我汽车上的蓝牙OBD2读取器,以在小型LCD上显示实时数据。
问题
我无法通过软件串行连接或写入HC05模块。我想我已经将其缩小为几种可能性。
- 我首先无法连接到模块。
我有Mega 2560和HC05。
5V VCC
GND GND
D2 RXD
D3 TXD
请注意,我已经看到9600和38400的连接波特率,但是都没有用,所以我做了这个功能来为我全部尝试...
//set up serial relay into HC05.
SoftwareSerial hc05(2,3);
//computer serial baud rate 115200
bool hc05_connect() {
long baud_list[] = {300,1200,2400,4800,9600,19200,38400,57600,74880,115200,230400};
Serial.println("Attempting to connect to HC05 bluetooth module...");
bool success = 0;
for (int i=0; i<(sizeof(baud_list) / sizeof(baud_list[0])); i++) {
Serial.print("Baud rate ");
Serial.print(baud_list[i]);
Serial.print("...");
hc05.begin(baud_list[i]);
hc05.write("AT");
delay(1000);
if (hc05.available()) {
Serial.println(" successful!");
success = 1;
return success;
} else {
Serial.println(" Failed");
}
}
return success;
}
注意:
- 对于每种波特率,这总是返回失败。
- 我将蓝牙模块置于命令模式,通过在供电时按下按钮来启动。
- 我已在上载草图时尝试拔下TX / RX引脚。没有区别。
- 我向HC05发送命令的尝试失败。
下面是我向模块发送命令的功能。
void loop() {
// listen for communication from the ESP8266 and then write it to the serial monitor
if (hc05.available()) {
Serial.write(hc05.read());
}
// listen for user input and send it to the ESP8266
if (Serial.available() > 0) {
Serial.println("Writing to hc05...");
Serial.println(Serial.available());
Serial.println(Serial.read());
hc05.write(Serial.read());
}
}
我添加了几行写回Serial的行,以便可以看到正在发送的内容,并且监视器返回奇怪的内容。例如,如果我发送“ AT”,则监视器将显示以下内容:
Writing to hc05...
3
65
Writing to hc05...
1
10
注意:
- 为什么要发送2个不同的项目?
- 为什么它发送整数而不是我说的字符?
- 这是否表示我只是向其发送废话命令,因此它没有响应?
如果您愿意,我可以提供完整的代码,尽管这已经是一个巨大的文字墙了。请帮帮我!
因此,我可以使用以下可修改的代码版本通过蓝牙模块通过两种方式进行通信:https://www.instructables.com/How-to-Set-Up-and-Test-Arduino-Bluetooth-Connectio/
我只能使用PC进行发送,而无法使用带有HC05的RX-TX0 / TX-RX0的SoftwareSerial接收到android蓝牙终端。 而且我能够接收到PC,而无法使用带有HC05的RX-TX1 / TX-RX1的硬件串行/ Serial1发送。
所以现在我有了RX-TX0 / TX-RX1。似乎是通过这样的终端进行通信的。
void setup() {
Serial.begin(9600); //open the serial port
Serial1.begin(9600);
}
void loop() {
if (Serial1.available()) {
Serial.print("(Received)");
Serial.println(Serial1.readString()); // send from serial to bluetooth
}
if (Serial.available()) {
Serial.print("(Sent)");
Serial.println(Serial.readString());
Serial1.println(Serial.readString()); // send from bluetooth to serial
}
}
在尝试一起破解之前,为什么要让串行在2个不同的串行通道上工作?奇怪...
解决方法
好的,所以我知道了。 (我不能说我完全理解,但这也许会对将来的人们有所帮助。)
1。无法连接到模块
感谢@ukBaz建议我连接手机上的终端应用程序,这使我能够首先调试与模块的连接。和@Juraj建议Mega使用硬件序列。
Serial1
显然在我的板上坏了,所以我正在使用Serial3
。我用手机将蓝牙连接到设备,并且能够以9600的波特率在Serial
和Serial3
之间来回发送命令。这是我使用的代码:
void setup() {
Serial.begin(9600); //open the serial port to PC
Serial3.begin(9600); //open serial port to HC05. TX -> 15,RX -> 14
}
void loop() {
if(Serial3.available()){
Serial.print(Serial3.readString()); // send from serial to bluetooth
}
if(Serial.available()){
Serial3.print(Serial.readString()); // send from bluetooth to serial
}
}
我怀疑我最初出于错误的目的使用了错误的read
/ readString
和write
/ print
/ println
。
2。无法向模块发出命令
一旦工作正常,我将波特率更改为38400,并将模块的STATE引脚连接到VCC(而不是使用按钮)。上传代码,断开5V,重新连接5V,重置arduino。
到那时,我可以通过串行监视器向模块发出“ AT”,然后返回“ OK”。哇!
我想我现在明白了,@ hlovdal暗示我正在向模块发出命令,但从未解析我得到的响应,所以..堵塞了吗?任何状况之下。我现在可以成功发出命令并接收来自模块的响应。
感谢大家的帮助。
,如何将AT命令行与设备通信。例如:
hc05.write("AT");
delay(1000);
您不向调制解调器发送 AT命令,而是发送包含零个或多个AT命令的 AT命令 line 通过命令行终止符(始终应为'\r'
,又名回车符(或<CR>
))。
您在这里缺少该终止符,因此调制解调器将永远不会向您发送答复,因为您尚未向其发送命令行。
而且,您应该从不永远不要使用延迟来代替读取和解析调制解调器返回的响应。有关更多详细信息,请参见this answer。