对于在使用 Arduino 的时候出现的这种问题,可以考虑使用不同的解决方案来避免 .read() 函数干扰 BLE 连接。以下是一个代码示例:
#include
#include
#include
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
uint8_t txValue = 0;
void setup() {
Serial.begin(115200);
// 创建 BLE 设备
BLEDevice::init("MyBLE");
// 创建 BLE 服务
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
// 创建 BLE 特征值
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->addDescriptor(new BLE2902());
// 开始服务
pService->start();
// 开始广播
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06);
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
}
void loop() {
// Handle BLE disconnect
if (!deviceConnected && BLEDevice::getConnections()->begin()) {
BLEDevice::getConnections()->clear();
deviceConnected = true;
}
// Handle BLE connect
if (deviceConnected && !BLEDevice::getConnections()->begin()) {
deviceConnected = false;
}
// Update characteristic value when device connected
if (deviceConnected) {
txValue++;
pCharacteristic->setValue(&txValue, 1);
pCharacteristic->notify();
delay(10);
}
}
可以看到,在这个示例中,我们没有使用 .read() 方法,而是使用了 BLECharacteristic 类的 setValue() 方法来设置 BLE 特征值,在 BLE 连接建立后使用 notify() 方法来将变更