0

我想使用定时器中断器结合BLE在esp32中传输。

我发现传输周期太快时会出现错误。

我不知道是什么导致了这个错误。请帮帮我.................................................. .............................. 错误

这是我的代码

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
////////////////////////////////////////////////////////////
#include <BLE2902.h>

#define PERIOD_MS 5
#define BAUD_RATE 115200
#define BLE_WR_EN 0x5A
#define BLE_WR_DIS 0x55
#define SERVICE_UUID        "0000ffe0-0000-1000-8000-00805f9b34fb"
#define CHARACTERISTIC_UUID_RX "0000ffe2-0000-1000-8000-00805f9b34fb"
#define CHARACTERISTIC_UUID_TX "0000ffe1-0000-1000-8000-00805f9b34fb"

int PERIOD_US=PERIOD_MS*1000;
/* create a hardware timer */
hw_timer_t * timer = NULL;

/* LED pin */
int led = 2;
/* LED state */
volatile byte state = LOW;
int i=0;

BLEServer *pServer;
BLEService *pService;
BLECharacteristic *pCharacteristic;

void IRAM_ATTR onTimer(){
  //state = !state;
  if(i<700){
    i++;  
  }
  else{
    i=0;  
  }
  //Serial.println(state);
  char txString[8];
  dtostrf(i, 1, 2, txString); 
  pCharacteristic->setValue(txString);
  pCharacteristic->notify();
  std::string txValue=pCharacteristic->getValue();
  Serial.print("txValue:");
  Serial.println(txValue.c_str());
  //digitalWrite(led, state);
}

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      Serial.println("********************************");
      Serial.println("Connected");
      Serial.println("********************************");
      timerAlarmEnable(timer);
    };

    void onDisconnect(BLEServer* pServer) {
      Serial.println("********************************");
      Serial.println("Disconnected");
      Serial.println("********************************");
      timerAlarmDisable(timer);
      //delay(1000);
      ///*
      // Start the service
      //pService->start();
    
      // Start advertising
      //pServer->getAdvertising()->start();
      pServer->startAdvertising();
      //*/
      //ESP.restart();
    }
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();
      std::string EN="Z";
      std::string DIS="U";
      Serial.print("rxValue:");
      Serial.println(rxValue.c_str());
      /*
      //Serial.println(getvalue);
      if (rxValue==EN ) {
        //g_Timer.enable(g_TimerId);
        timerAlarmEnable(timer);
        digitalWrite(LED, HIGH);
      } 
      else if (rxValue==DIS) {
        //g_Timer.disable(g_TimerId);
        timerAlarmDisable(timer);
        //data_count = 0;
        digitalWrite(LED, LOW);
      }
      */
    }
};

void setup() {
  Serial.begin(115200);
  Serial.begin(BAUD_RATE);
  ////////////////////////////////////////
  Serial.println("Starting BLE Server!");
  
  BLEDevice::init("ESP32-INTERRUT-Server");
  
  /////////////////////////////////////////////////////////////////////////////////////
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a BLE Characteristic
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID_TX,
                      BLECharacteristic::PROPERTY_READ|
                      BLECharacteristic::PROPERTY_NOTIFY 
                    );
                      
  pCharacteristic->addDescriptor(new BLE2902());

  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID_RX,
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setCallbacks(new MyCallbacks());

  // Start the service
  pService->start();

  // Start advertising
  pServer->getAdvertising()->start();
  ////////////////////////////////////////////////////////////////////
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, PERIOD_US, true);
  timerAlarmDisable(timer);
  
}

void loop() {

}
4

0 回答 0