Arduino Leonardo - Настройка bluetooth - AT команда из терминала ничего не возвращает
Я пытаюсь настроить Bluetooth с помощью платы, содержащей чип Arduino Leonardo.
Моя полная настройка такова:
Основная плата: https://www.dfrobot.com/product-1148.html
Базовый щит: https://coolcomponents.co.uk/products/grove-base-shield-for-arduino-v2
Модуль Bluetooth: https://wiki .seeedstudio.com/Grove-Serial_Bluetooth_v3.0 /
Модуль Bluetooth подключается к порту D8 базового экрана. Причина в том, что "не все контакты на Leonardo и Micro поддерживают изменение прерываний, поэтому для RX можно использовать только следующие: 8, 9, 10, 11, 14 ( МИСО), 15 (SCK), 16 (MOSI)". https://www.arduino.cc/en/Reference/SoftwareSerial
Вот полный код.
#include <SoftwareSerial.h> //Последовательный порт программного обеспечения
/*Connect your Bluetooth Module to D8 otherwise it will not work due to Arduino Leonardo */
#define RxD 8
#define TxD 9
SoftwareSerial blue(RxD,TxD);
void setup()
{
Serial.begin(9600);
blue.begin(9600); //ничего, кроме 9600, работать не будет
// дождитесь подключения последовательного порта. Необходимо для родного USB
while(!Serial){
;
}
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
Serial.print("Started\n");
setupBlueToothConnection();
}
void loop() {
char recvChar;
while(1)
{
if(blue.available())
{// проверьте, есть ли какие-либо данные, отправленные с удаленного экрана Bluetooth
recvChar = blue.read();
Serial.print(recvChar);
}
if(Serial.available())
{// проверьте, есть ли какие-либо данные, отправленные с локального последовательного терминала, вы можете добавить другие приложения здесь
recvChar = Serial.read();
blue.print(recvChar);
delay(400);
}
}
}
void setupBlueToothConnection()
{
//blue.begin (9600);
blue.print("AT");
delay(400);
blue.print("AT+ROLES"); // установить роль в качестве подчиненной
delay(400);
blue.print("AT+NAMESlave"); // установите имя bluetooth как "Slave", длина имени Bluetooth должна быть менее 12 символов.
delay(400);
blue.print("AT+AUTH1");
delay(400);
blue.flush();
}
Выход с последовательного монитора (установлен как NL & CR, 9600) выглядит следующим образом:
Started
OKOK+Set:SOK+Set:SlaveOK+Set:1
Проблема в том, что когда я посылаю команды AT из терминала, я ничего не получаю взамен. Однако если я посылаю команду AT из IDE, я получаю обратную связь от bluetooth.
@Mr. Panda, 👍2
Обсуждение1 ответ
Лучший ответ:
Проблема устранена.
Примечание: Эта версия включает Serial1, а не SoftwareSerial. В остальном все то же самое.
Serial.read()
Возвращает первый байт доступных входящих последовательных данных.
Поэтому, когда я отправляю команду AT из терминала, она отправляет "A", а затем "T", а не "AT" в виде строки, которую Bluetooth ожидает, как указано в документации продукта:
AT Command format: Верхний регистр AT command format. строковый формат, без каких-либо других символов (например, \r или \n).
Поэтому я добавил следующую функцию:
String SerialString() { // Функция для генерации строки из символов, отправленных через последовательный монитор
String inputString = ""; // для хранения строки
while (Serial.available()) {
char inputChar = (char)Serial.read(); // получить новый байт:
inputString += inputChar; // добавьте его в inputString:
}
return inputString; // возвращает завершенную строку
}
Затем внутри void loop():
String WholeCommand = "";
if(Serial.available() > 0){
WholeCommand = SerialString();
Serial1.print(WholeCommand);
}
Теперь, когда я посылаю AT с последовательного монитора, я могу получить OK от Bluetooth.
Для меня это странно. Обычно, когда устройства принимают AT-команды, они дают вам все время в мире для выполнения команды, и ее завершение означает отправку `\ r". Интересно, нет ли какой-нибудь настройки, которая заставила бы эту штуку вести себя нормально?, @timemage
Я определенно согласен с вашей точкой зрения, вот почему я боролся. Однако в их документации: [ссылка](https://files.seeedstudio.com/wiki/Bluetooth_Shield_V2/res/Bluetooth_en.pdf ) вот как они это излагают., @Mr. Panda
Я нашел ссылку **"В верхнем регистре в формате команды. строковый формат, без каких-либо других символов. (например, \r или \n) ". ** Для будущих читателей вы можете включить эту цитату и ссылку на таблицу данных в свой ответ. Если бы это был я, я бы бросил эту штуку и купил другой модуль., @timemage
Включил их, как вы и предлагали. К сожалению, они покупаются оптом, поэтому мне нужно придумать, как их лучше всего использовать., @Mr. Panda
Да, я понимаю. Хорошо, что ваш вопрос / ответ существует и может быть найден и понят независимо от этого., @timemage
- Поддерживает ли MKR WIFI 1010 контроллер мыши и клавиатуры Arduino?
- HC-05 не может использовать нижние пины только 8 и выше
- Как использовать SPI на Arduino?
- Можно ли измерить скорость акселерометром? Насколько точно?
- Arduino Pro Micro, получить данные с контакта Tx?
- Хочу создать Bluetooth audio control (увеличение/уменьшение громкости, воспроизведение, пауза и т.д.) для смартфона
- Нажать клавишу Windows, используя «keyboard.press();»
- Как подключить вывод INT MPU 6050?
избавьтесь от задержки почти в 1/2 секунды в loop() .... также избавьтесь от
while (1)
... цикл () уже некоторое время (1), @jsotolaпочему вы используете SoftwareSerial, а не Serial1? используйте
Serial.write(recvChar);
. возможно, вы не отправляете символ конца строки для завершения команды, @Juraj@jsotola - Мне понадобятся два цикла while, поэтому я оставил это так. Сокращение его на 1 цикл и устранение задержки не устранили проблему. Я также добавлю модуль Zigbee, поэтому я использовал программное обеспечение serial. Я также пробовал использовать "Serial1", но ничего не изменилось. Просто для уточнения - отправка команды AT с помощью кода работает, например, "Serial1.print ("AT"), однако, если я отправлю ее с последовательного монитора, ничего не вернется., @Mr. Panda
Я собирался спросить вас, что именно вы отправляете с терминала, в частности, какое завершение строки. Но теперь я вижу, что у вас нет завершения для ваших AT-команд в setupBlueToothConnection. Действительно ли это тот код, с которым вы тестируете?, @timemage
Да @timemage это точно такой же код, который я тестирую., @Mr. Panda