от
У меня есть код, который я использую для передачи данных датчика с ESP32 через Bluetooth Low Energy на Raspberry Pi. Я заметил, что данные, которые я получаю на приемнике после первых 4 байтов, неверны и содержат случайные значения, но это не влияет на каждый пакет. Я использую FreeRTOS для работы с несколькими датчиками и BLE одновременно. Я проверил, что я получаю пакеты с неправильными данными после первых 4 байтов на Wireshark. В приведенном ниже коде я также распечатываю данные, которые собираюсь передать, и то, что я вижу на этом последовательном мониторе Arduino, несовместимо с тем, что я вижу в Wireshark, когда я ищу поврежденные пакеты, то есть на последовательном мониторе отображаются данные, которые я ожидаю увидеть Я пытался обновить библиотеки BLE, увеличив размер стека для моих задач FreeRTOS на случай переполнения стека. Я также попытался сравнить пакеты, которые я вижу на Wireshark, с данными, которые я передаю до и после моих вызовов bletify, и мои данные в буфере выглядят нормально, но пакеты, которые я получаю на Wireshark, неверны. Я также попытался увеличить размер MTU на случай, если мои пакеты были слишком большими. На данный момент я думаю, что это как-то связано с ОСРВ, потому что я следовал примерам на https://github.com/nkolban/esp32-snippets и на форумах, посвященных функциональности BLE ESP32. Любая помощь или указатели в правильном направлении будет принята с благодарностью. Вот так я настроил сервис BLE и характеристики
void init_BLE() {
  Serial.println("Starting setup");
  btStart();

  BLEDevice::init("esp32");
  BLEDevice::setMTU(64); // debug with larger MTU size
  bleServer = BLEDevice::createServer();
  bleServer

Вот как я передаю по Bluetooth


void valueToByteArray(void* val, size_t val_size, uint8_t *byte_arr) {
  /*
     Takes an arbitrary value and its size, then copies it into the byte array
  */
  for (int c_pos = 0; c_pos < val_size;   c_pos) {
    byte_arr[c_pos] = *((uint8_t*)val   c_pos);
  }
}

/*
   BLE Publishing Task
*/
void bleTaskHandler(void* pvParameters) {
  //Delay Var
  TickType_t lastUnblock; // used to prevent bluetooth stack congestion
  EventBits_t uxBits; //used to keep track of sensor events

  //Packet Counter
  static uint16_t counter = 0;

  // Send
  bool send_buffer = false;

  //Packet Storage
  uint8_t ble_buffer[20]; //

  //imu variables
  struct imuReading xyztReading;

  //rht variables
  struct rhtReading rht;

  //adc variables
  float adcVal;


  init_BLE();
  while (true) {
    send_buffer = false;
    uxBits = xEventGroupWaitBits(eg, ADC_TASK_BIT | IMU_TASK_BIT | RHT_TASK_BIT, pdTRUE, pdFALSE, (TickType_t) pdMS_TO_TICKS(5));


/*
Everything below here is just for getting data and putting it on the buffer
I've removed the extra members in the packet to simplify things. I still see the problem with this reduced version.
*/
    if ( (IMU_TASK_BIT

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

...