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.

, 👍2

Обсуждение

избавьтесь от задержки почти в 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


1 ответ


Лучший ответ:

2

Проблема устранена.

Примечание: Эта версия включает 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