Bluetooth-соединение ESP32 отключается после завершения чтения буфера - PullRequest
0 голосов
/ 07 июня 2019

Я программирую ESP32 для приема команд Bluetooth и отправки данных Bluetooth обратно на телефон с помощью профиля Serial.Для этого я использую Arduino Espressif Bluetooth Serial Library.Всякий раз, когда я отправляю что-то в ESP32, он обрабатывает это, а затем внезапно закрывает соединение Bluetooth.

И я уже пробовал различные задержки, потому что подумал, что, возможно, процессор не поспевает за другими вещами, из-за которыхоно сломалось.Однако при мониторинге с использованием последовательного соединения через USB он все равно продолжает посылать обновления статуса.Кроме этого, я не мог найти решение (в том числе и в Интернете).

Поскольку я новичок, я не хотел пытаться создать свою собственную библиотеку последовательного интерфейса Bluetooth.ESP не падает при отправке данных.Он также продолжает обрабатывать данные, которые были отправлены.Я вижу, что при отправке символов, которые я отправил через Bluetooth, используя последовательный интерфейс после их сбора.

Невозможно восстановить соединение после этого инцидента, независимо от того, как долго я буду ждать.

Моя функция Main, содержащая вызов функции, а также буфер для записи результата, поскольку я думал, что, возможно, я неправильно использовал это.

void loop() {

  if (ESP_BT.available() > 0)
  {
    char *buffer = (char*) malloc(InputSize);
    getCurrentMessage(ESP_BT, buffer, InputSize);
    Serial.println(buffer);
    strncpy(currentMessage, buffer, InputSize);
    free(buffer);
  }
  if (millis() %2000 == 0){
    Serial.println("Debug");
    delay(1);
  }
} 

Функция, которая вызывается, должна читать inputBuffer объектаBluetoothSerial в моем буфере.

void getCurrentMessage(BluetoothSerial ESP_BT, char* receivedChars, int InputSize)
{
 Serial.println("DEBUG: getCurrentMessageInit");
 static byte ndx = 0;

 char rc;

 while (ESP_BT.available() > 0){
   ESP_BT.println("DEBUG: Message Available");    
   Serial.println("DEBUG: Message Available");
   rc = ESP_BT.read();
   receivedChars[ndx] = rc;
   ndx++;
   delay(100);
   if (ndx >= InputSize){
     while(ESP_BT.available() > 0){
       ESP_BT.read();
     }
   }
 }
} 

Я ожидаю, что соединение Bluetooth продолжит работать.Это не делает.Я также получил код ошибки "queue.c: 1442 (xQueueGenericReceive) - ошибка подтверждения!"Если не использовать задержки и ESP, то перезагружается.Это не делает после того, как я включил задержки.

1 Ответ

0 голосов
/ 08 июня 2019

Проблема заключалась в том, что я не вызывал свой объект Bluetooth по ссылке.Вместо того, чтобы давать моей функции объект Bluetooth, я должен указать на него:

void getCurrentMessage(BluetoothSerial* ESP_BT, char* receivedChars, int InputSize)
{
 Serial.println("DEBUG: getCurrentMessageInit");
 static byte ndx = 0;

 char rc;

 while (ESP_BT->available() > 0){
   ESP_BT->println("DEBUG: Message Available");    
   Serial.println("DEBUG: Message Available");
   rc = ESP_BT.read();
   receivedChars[ndx] = rc;
   ndx++;
   delay(100);
   if (ndx >= InputSize){
     while(ESP_BT->available() > 0){
       ESP_BT->read();
     }
   }
 }
} 
...