Ошибки при попытке использовать библиотеку HC-05 для автоматизированных AT-команд
Я пытаюсь использовать HC-05 с Arduino UNO для проекта носимых устройств, над которым я работаю. Я хочу сортировать "автоматические" соединения, не требуя от пользователей смены оборудования для входа в режим AT, и не заставляя их вводить команды AT. Для этого я использую библиотеку HC-05, которую я нашел на github: https://github.com/jdunmire/HC05. В конце концов я захочу выполнить поиск устройств (AT+INQ), сохранить адреса Bluetooth в строке и проверить имя каждого устройства, соответствующего каждому адресу. Затем я подключусь к тем, у кого есть конкретное имя.
Я сталкиваюсь с множеством проблем, поэтому решил, что начну с самых распространенных.
При попытке запустить много разных команд (AT+ORGL, AT+INIT, AT+INQM, AT+INQ, AT+UART, просто чтобы назвать некоторые из наиболее часто неработающих), я часто получаю ответ "тайм-аут 1" вместо этого "ОК"
Это случается довольно часто, и я не уверен, почему... Иногда функции отключаются, я включаю и выключаю устройство, и внезапно они снова работают (или наоборот).
Ниже приведен простой код, который я написал только для того, чтобы попытаться воспроизвести результаты, используя "AT+ORGL", и что вы знаете, те же результаты...
#include "HC05.h"
#ifdef HC05_SOFTWARE_SERIAL
#include <SoftwareSerial.h>
HC05 btSerial = HC05(A2, A5, A3, A4); // cmd, state, rx, tx
#else
HC05 btSerial = HC05(3, 2); // cmd, state
#endif
#ifdef DEBUG_HC05
#ifdef DEBUG_SW_PORT
extern SoftwareSerial DEBUG_PORT; //This will allow me to print to serial without sending to BT
#endif
#endif
void setup() {
DEBUG_BEGIN(38400);
DEBUG_PRINTLN("Setup");
delay(3000); // this delay is for debugging convenience only
DEBUG_PRINTLN("DelayComplete");
btSerial.findBaud();
btSerial.cmd("AT"); //Let's test to make sure the KEY pin is connected well
btSerial.cmd("AT+ORGL");
}
void loop() {
}
Вот результаты в серийном мониторе:
Setup
DelayComplete
findBaud
Trying 4800... x
Trying 9600... x
Trying 19200... x
Trying 38400... Found.
AT
OK
AT+ORGL
timeout 1
Вот фотография моего фриттинга
Проводка - это проводка, используемая во всех примерах библиотеки. Кажется, что ошибка "timeout 1" закодирована здесь в библиотеке HC05.cpp:
int HC05::cmd(const char* cmd, unsigned long timeout)
{
int recvd = 0;
DEBUG_PRINTLN(cmd);
setCmdPin(HIGH);
// No spec for how long it takes to enter command mode, but 100ms
// seems to work- assuming the output has been drained.
delay(100);
_btSerial.write(cmd);
_btSerial.write("\r\n");
_btSerial.setTimeout(timeout);
do
{
// ATTENTION: At least through Arduino v1.0.3, it is not possible
// to tell the difference between a timeout and
// receiving only the termination character (NL in this
// case), because the termination character is not
// returned and timeout is not returned as a unique
// indication.
// In this case the result would be an early return
// of a multiline response before the OK is received.
// The return would incorrectly indicate an error (no
// OK response).
recvd = _btSerial.readBytesUntil('\n',_buffer,_bufsize);
if (recvd > 0)
{
DEBUG_WRITE((uint8_t *)_buffer,recvd);
DEBUG_WRITE('\n');
}
else
{
DEBUG_PRINTLN("timeout 1");
}
}
while ((recvd > 0) && (_buffer[0] != 'O' || _buffer[1] != 'K'));
setCmdPin(LOW);
// Empirically determined that it takes some time to reliably exit
// command mode. The appeared to be a baud rate dependency and with
// >100ms required at 9600 baud.
delay(150);
return((_buffer[0] == 'O' && _buffer[1] == 'K'));}
}
Я не уверен, как я могу исправить свою ошибку. Любые предложения очень ценятся!
Я полагаю, что я использую HC-05: http://www.dsdtech-global.com/2017/07/dsd-tech-hc-06-wireless-bluetooth.html