NimBLE-Arduino
NimBLE-Arduino copied to clipboard
Crash with 'Arduino Nano ESP32' on core ESP32 3.0.1 with NimbleV1.4.2
I installed the latest NimBLE 1.4.2 library and compiled it for the Arduino Nano ESP32 board with ESP32 core 2.0.13, which worked fine.
Then, I switched to the ESP32 3.0.1 board, restarted my PC, and compiled my program using NimBLE for ESP32-C3 and ESP32-S3 boards, which also worked fine.
However, the Arduino Nano ESP32 crashes when compiling and uploading with the ESP32 core 3.0.1.
I attempted the example programs 'NimBLE_Scan_Continuous' and 'BLE_uart', and both caused the Nano to crash.
After compilation, the upload COM port, COM13 in my case, disappears, and a new COM port, COM12, appears after the upload.
There are no errors during compilation, but the Arduino Nano must be put into boot mode for a new upload.
I tried the ArduinoBLE example 'Scan', which worked, but the 'UART' example failed to compile, showing errors. This is unfortunate because I need the UART connectivity.
Below the BLE code in my program
//-------------------------------------------- //
// BLE
// SendMessage by BLE Slow in packets of 20 chars
// or fast in one long string.
// Fast can be used in IOS app BLESerial Pro
//------------------------------
void SendMessageBLE(std::string Message)
{
if(deviceConnected)
{
if (Mem.UseBLELongString) // If Fast transmission is possible
{
pTxCharacteristic->setValue(Message);
pTxCharacteristic->notify();
delay(10); // Bluetooth stack will go into congestion, if too many packets are sent
}
else // Packets of max 20 bytes
{
int parts = (Message.length()/20) + 1;
for(int n=0;n<parts;n++)
{
pTxCharacteristic->setValue(Message.substr(n*20, 20));
pTxCharacteristic->notify();
delay(40); // Bluetooth stack will go into congestion, if too many packets are sent
}
}
}
}
//-----------------------------
// BLE Start BLE Classes
//------------------------------
class MyServerCallbacks: public BLEServerCallbacks
{
void onConnect(BLEServer* pServer) {deviceConnected = true; };
void onDisconnect(BLEServer* pServer) {deviceConnected = false;}
};
class MyCallbacks: public BLECharacteristicCallbacks
{
void onWrite(BLECharacteristic *pCharacteristic)
{
std::string rxValue = pCharacteristic->getValue();
ReceivedMessageBLE = rxValue + "\n";
// if (rxValue.length() > 0) {for (int i = 0; i < rxValue.length(); i++) printf("%c",rxValue[i]); }
// printf("\n");
}
};
//-------------------------------------------- //
// BLE Start BLE Service
//------------------------------
void StartBLEService(void)
{
BLEDevice::init(Mem.BLEbroadcastName); // Create the BLE Device
pServer = BLEDevice::createServer(); // Create the BLE Server
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID); // Create the BLE Service
pTxCharacteristic = // Create a BLE Characteristic
pService->createCharacteristic(CHARACTERISTIC_UUID_TX, NIMBLE_PROPERTY::NOTIFY);
BLECharacteristic * pRxCharacteristic =
pService->createCharacteristic(CHARACTERISTIC_UUID_RX, NIMBLE_PROPERTY::WRITE);
pRxCharacteristic->setCallbacks(new MyCallbacks());
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pServer->start(); // Start the server Nodig??
pServer->getAdvertising()->start(); // Start advertising
TekstSprint("BLE Waiting a client connection to notify ...\n");
}
// //
//-----------------------------
// BLE CheckBLE
//------------------------------
void CheckBLE(void)
{
if(!deviceConnected && oldDeviceConnected) // Disconnecting
{
delay(300); // Give the bluetooth stack the chance to get things ready
pServer->startAdvertising(); // Restart advertising
TekstSprint("Start advertising\n");
oldDeviceConnected = deviceConnected;
}
if(deviceConnected && !oldDeviceConnected) // Connecting
{
oldDeviceConnected = deviceConnected;
SWversion();
}
if(ReceivedMessageBLE.length()>0)
{
SendMessageBLE(ReceivedMessageBLE);
String BLEtext = ReceivedMessageBLE.c_str();
ReceivedMessageBLE = "";
ReworkInputString(BLEtext);
}
}