espressif / arduino-esp32

Arduino core for the ESP32
GNU Lesser General Public License v2.1
13.29k stars 7.35k forks source link

Corrupted Serial.printf(), possible memory issue in BLE when receiving long value #4695

Closed Sonnbc closed 3 years ago

Sonnbc commented 3 years ago

Hardware:

Board: ESP32 Dev Module. I have a NodeMCU-32 v1.2 and have tried it with Node32s, NodeMCU-32S and ESP32 Dev Module board options with the same result. Core Installation version: 1.0.4 IDE name: Arduino IDE Flash Frequency: 40Mhz. Also tried with 80Mhz with the same result. PSRAM enabled: no Upload Speed: 115200 Computer OS: Mac OSX

Description:

I'm creating a BLE server on my ESP dev module with 1 characteristic. Writing a long string to this characteristic (for example, with the nRF Connect app on my phone) seems to cause memory corruption on the board.

Reproduce:

  1. Compile and upload the code below
  2. Use nRF Connect on a phone (or any app that supports sending characteristic values) to send the string (ASCII) aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd (20 characters of a, b, c, d each) to the only characteristic on the BLE server.
  3. As you can see, from line 10 and 11 in the sketch:
    const char* value = pCharacteristic->getValue().c_str();
    Serial.printf("onWrite %s\n", value);

    Problem: Arduino IDE console on the server shows wrong output:

    onWrite onWrite aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd

    the string onWrite (8 bytes) is duplicated and written into our long string. Only 12 as left. This seems like a memory bug.

  4. Replace line 11 with the following prints the expected log.
    Serial.printf("onWrite %s\n", pCharacteristic->getValue().c_str());

    Output:

    onWrite aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd

But why did the original printf statement fail to print correctly?

Sketch:

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

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

class BLEManager : public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    const char* value = pCharacteristic->getValue().c_str();
    Serial.printf("onWrite %s\n", value);
  }
};

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  BLEDevice::init("Long name works now");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("Hello World says Neil");
  pCharacteristic->setCallbacks(new BLEManager());

  pService->start();
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("Characteristic defined! Now you can read it in your phone!");
}

void loop() {
  delay(2000);
}

Debug Messages:

21:49:52.690 -> ⸮⸮⸮⸮    ⸮sY SPIWP:0xee
21:49:52.690 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
21:49:52.690 -> mode:DIO, clock div:1
21:49:52.690 -> load:0x3fff0018,len:4
21:49:52.690 -> load:0x3fff001c,len:1216
21:49:52.727 -> ho 0 tail 12 room 4
21:49:52.727 -> load:0x40078000,len:9720
21:49:52.727 -> ho 0 tail 12 room 4
21:49:52.727 -> load:0x40080400,len:6352
21:49:52.727 -> entry 0x400806b8
21:49:53.048 -> Starting BLE work!
21:49:53.659 -> [V][BLEDevice.cpp:76] createServer(): >> createServer
21:49:53.695 -> [V][BLEServer.cpp:281] registerApp(): >> registerApp - 0
21:49:53.695 -> [D][FreeRTOS.cpp:189] take(): Semaphore taking: name: RegisterAppEvt (0x3ffdcfa8), owner: <N/A> for registerApp
21:49:53.695 -> [D][FreeRTOS.cpp:198] take(): Semaphore taken:  name: RegisterAppEvt (0x3ffdcfa8), owner: registerApp
21:49:53.695 -> [V][FreeRTOS.cpp:63] wait(): >> wait: Semaphore waiting: name: RegisterAppEvt (0x3ffdcfa8), owner: registerApp for registerApp
21:49:53.799 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:49:53.799 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:49:53.799 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:49:53.799 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:49:53.799 -> [V][FreeRTOS.cpp:143] give(): Semaphore giving: name: RegisterAppEvt (0x3ffdcfa8), owner: registerApp
21:49:53.799 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
21:49:53.799 -> [V][FreeRTOS.cpp:77] wait(): << wait: Semaphore released: name: RegisterAppEvt (0x3ffdcfa8), owner: <N/A>
21:49:53.799 -> [V][BLEServer.cpp:285] registerApp(): << registerApp
21:49:53.799 -> [V][BLEDevice.cpp:83] createServer(): << createServer
21:49:53.799 -> [V][BLEServer.cpp:67] createService(): >> createService - 4fafc201-1fb5-459e-8fcc-c5c9c331914b
21:49:53.799 -> [D][FreeRTOS.cpp:189] take(): Semaphore taking: name: CreateEvt (0x3ffdd1ec), owner: <N/A> for createService
21:49:53.799 -> [D][FreeRTOS.cpp:198] take(): Semaphore taken:  name: CreateEvt (0x3ffdd1ec), owner: createService
21:49:53.799 -> [V][BLEService.cpp:60] executeCreate(): >> executeCreate() - Creating service (esp_ble_gatts_create_service) service uuid: 4fafc201-1fb5-459e-8fcc-c5c9c331914b
21:49:53.831 -> [D][FreeRTOS.cpp:189] take(): Semaphore taking: name: CreateEvt (0x3ffdd450), owner: <N/A> for executeCreate
21:49:53.831 -> [D][FreeRTOS.cpp:198] take(): Semaphore taken:  name: CreateEvt (0x3ffdd450), owner: executeCreate
21:49:53.831 -> [V][FreeRTOS.cpp:63] wait(): >> wait: Semaphore waiting: name: CreateEvt (0x3ffdd450), owner: executeCreate for executeCreate
21:49:53.845 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:49:53.845 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:49:53.876 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:49:53.876 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:49:53.876 -> [V][FreeRTOS.cpp:143] give(): Semaphore giving: name: CreateEvt (0x3ffdd1ec), owner: createService
21:49:53.876 -> [V][BLEService.cpp:194] setHandle(): >> setHandle - Handle=0x28, service UUID=4fafc201-1fb5-459e-8fcc-c5c9c331914b)
21:49:53.920 -> [V][BLEService.cpp:200] setHandle(): << setHandle
21:49:53.920 -> [V][FreeRTOS.cpp:143] give(): Semaphore giving: name: CreateEvt (0x3ffdd450), owner: executeCreate
21:49:53.920 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
21:49:53.920 -> [V][FreeRTOS.cpp:77] wait(): << wait: Semaphore released: name: CreateEvt (0x3ffdd450), owner: <N/A>
21:49:53.920 -> [V][BLEService.cpp:76] executeCreate(): << executeCreate
21:49:53.920 -> [V][FreeRTOS.cpp:63] wait(): >> wait: Semaphore waiting: name: CreateEvt (0x3ffdd1ec), owner: <N/A> for createService
21:49:53.952 -> [V][FreeRTOS.cpp:77] wait(): << wait: Semaphore released: name: CreateEvt (0x3ffdd1ec), owner: <N/A>
21:49:53.952 -> [V][BLEServer.cpp:83] createService(): << createService
21:49:53.952 -> [V][BLEService.cpp:222] addCharacteristic(): >> addCharacteristic()
21:49:53.952 -> [D][BLEService.cpp:225] addCharacteristic(): Adding characteristic: uuid=beb5483e-36e1-4688-b7f5-ea07361b26a8 to service: UUID: 4fafc201-1fb5-459e-8fcc-c5c9c331914b, handle: 0x0028
21:49:53.986 -> [V][BLEService.cpp:237] addCharacteristic(): << addCharacteristic()
21:49:53.986 -> [V][BLECharacteristic.cpp:646] setValue(): >> setValue: length=21, data=48656c6c6f20576f726c642073617973204e65696c, characteristic UUID=beb5483e-36e1-4688-b7f5-ea07361b26a8
21:49:53.986 -> [D][FreeRTOS.cpp:189] take(): Semaphore taking: name: SetValue (0x3ffdddbc), owner: <N/A> for <Unknown>
21:49:54.024 -> [D][FreeRTOS.cpp:198] take(): Semaphore taken:  name: SetValue (0x3ffdddbc), owner: <Unknown>
21:49:54.024 -> [V][FreeRTOS.cpp:143] give(): Semaphore giving: name: SetValue (0x3ffdddbc), owner: <Unknown>
21:49:54.024 -> [V][BLECharacteristic.cpp:655] setValue(): << setValue
21:49:54.024 -> [V][BLECharacteristic.cpp:570] setCallbacks(): >> setCallbacks: 0x3ffdd2ac
21:49:54.024 -> [V][BLECharacteristic.cpp:576] setCallbacks(): << setCallbacks
21:49:54.024 -> [V][BLEService.cpp:134] start(): >> start(): Starting service (esp_ble_gatts_start_service): UUID: 4fafc201-1fb5-459e-8fcc-c5c9c331914b, handle: 0x0028
21:49:54.060 -> [V][BLECharacteristic.cpp:79] executeCreate(): >> executeCreate()
21:49:54.060 -> [D][BLECharacteristic.cpp:90] executeCreate(): Registering characteristic (esp_ble_gatts_add_char): uuid: beb5483e-36e1-4688-b7f5-ea07361b26a8, service: UUID: 4fafc201-1fb5-459e-8fcc-c5c9c331914b, handle: 0x0028
21:49:54.060 -> [D][FreeRTOS.cpp:189] take(): Semaphore taking: name: CreateEvt (0x3ffdd6f8), owner: <N/A> for executeCreate
21:49:54.097 -> [D][FreeRTOS.cpp:198] take(): Semaphore taken:  name: CreateEvt (0x3ffdd6f8), owner: executeCreate
21:49:54.097 -> [V][FreeRTOS.cpp:63] wait(): >> wait: Semaphore waiting: name: CreateEvt (0x3ffdd6f8), owner: executeCreate for executeCreate
21:49:54.097 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:49:54.097 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:49:54.135 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:49:54.135 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:49:54.135 -> [V][BLECharacteristic.cpp:591] setHandle(): >> setHandle: handle=0x2a, characteristic uuid=beb5483e-36e1-4688-b7f5-ea07361b26a8
21:49:54.135 -> [V][BLECharacteristic.cpp:593] setHandle(): << setHandle
21:49:54.135 -> [V][BLECharacteristic.cpp:198] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:49:54.168 -> [V][FreeRTOS.cpp:143] give(): Semaphore giving: name: CreateEvt (0x3ffdd6f8), owner: executeCreate
21:49:54.168 -> [V][BLECharacteristic.cpp:452] handleGATTServerEvent(): << handleGATTServerEvent
21:49:54.168 -> [V][FreeRTOS.cpp:77] wait(): << wait: Semaphore released: name: CreateEvt (0x3ffdd6f8), owner: <N/A>
21:49:54.168 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
21:49:54.206 -> [V][BLECharacteristic.cpp:116] executeCreate(): << executeCreate
21:49:54.206 -> [D][FreeRTOS.cpp:189] take(): Semaphore taking: name: StartEvt (0x3ffdd510), owner: <N/A> for start
21:49:54.206 -> [D][FreeRTOS.cpp:198] take(): Semaphore taken:  name: StartEvt (0x3ffdd510), owner: start
21:49:54.206 -> [V][FreeRTOS.cpp:63] wait(): >> wait: Semaphore waiting: name: StartEvt (0x3ffdd510), owner: start for start
21:49:54.206 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:49:54.243 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:49:54.243 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:49:54.243 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:49:54.243 -> [V][FreeRTOS.cpp:143] give(): Semaphore giving: name: StartEvt (0x3ffdd510), owner: start
21:49:54.243 -> [V][BLECharacteristic.cpp:198] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:49:54.278 -> [V][FreeRTOS.cpp:77] wait(): << wait: Semaphore released: name: StartEvt (0x3ffdd510), owner: <N/A>
21:49:54.278 -> [V][BLECharacteristic.cpp:452] handleGATTServerEvent(): << handleGATTServerEvent
21:49:54.278 -> [V][BLEService.cpp:159] start(): << start()
21:49:54.278 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
21:49:54.278 -> [I][BLEDevice.cpp:554] getAdvertising(): create advertising
21:49:54.313 -> [D][BLEDevice.cpp:556] getAdvertising(): get advertising
21:49:54.313 -> [V][BLEDevice.cpp:561] startAdvertising(): >> startAdvertising
21:49:54.313 -> [D][BLEDevice.cpp:556] getAdvertising(): get advertising
21:49:54.313 -> [V][BLEAdvertising.cpp:177] start(): >> start: customAdvData: 0, customScanResponseData: 0
21:49:54.313 -> [D][BLEAdvertising.cpp:189] start(): - advertising service: 4fafc201-1fb5-459e-8fcc-c5c9c331914b
21:49:54.350 -> [V][BLEAdvertising.cpp:237] start(): << start
21:49:54.350 -> [V][BLEDevice.cpp:563] startAdvertising(): << startAdvertising
21:49:54.350 -> [V][BLEUtils.cpp:1817] gapEventToString(): gapEventToString: Unknown event type 0 0x00
21:49:54.350 -> [V][BLEUtils.cpp:1049] dumpGapEvent(): Received a GAP event: Unknown event type
21:49:54.350 -> [V][BLEUtils.cpp:1264] dumpGapEvent(): *** dumpGapEvent: Logger not coded ***
21:49:54.350 -> [D][BLEDevice.cpp:556] getAdvertising(): get advertising
21:49:54.385 -> [D][BLEAdvertising.cpp:491] handleGAPEvent(): handleGAPEvent [event no: 0]
21:49:54.385 -> [V][BLEUtils.cpp:1817] gapEventToString(): gapEventToString: Unknown event type 1 0x01
21:49:54.385 -> [V][BLEUtils.cpp:1049] dumpGapEvent(): Received a GAP event: Unknown event type
21:49:54.385 -> [V][BLEUtils.cpp:1264] dumpGapEvent(): *** dumpGapEvent: Logger not coded ***
21:49:54.385 -> [D][BLEDevice.cpp:556] getAdvertising(): get advertising
21:49:54.385 -> [D][BLEAdvertising.cpp:491] handleGAPEvent(): handleGAPEvent [event no: 1]
21:49:54.423 -> [V][BLEUtils.cpp:1817] gapEventToString(): gapEventToString: Unknown event type 6 0x06
21:49:54.423 -> [V][BLEUtils.cpp:1049] dumpGapEvent(): Received a GAP event: Unknown event type
21:49:54.423 -> [V][BLEUtils.cpp:1264] dumpGapEvent(): *** dumpGapEvent: Logger not coded ***
21:49:54.423 -> [D][BLEDevice.cpp:556] getAdvertising(): get advertising
21:49:54.423 -> [D][BLEAdvertising.cpp:491] handleGAPEvent(): handleGAPEvent [event no: 6]
21:50:06.990 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:50:07.028 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:50:07.028 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:50:07.028 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:07.028 -> [V][BLECharacteristic.cpp:198] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:07.028 -> [V][BLECharacteristic.cpp:452] handleGATTServerEvent(): << handleGATTServerEvent
21:50:07.063 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
21:50:07.171 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:50:07.171 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:50:07.171 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:50:07.171 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:07.171 -> [V][BLECharacteristic.cpp:198] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:07.208 -> [V][BLECharacteristic.cpp:452] handleGATTServerEvent(): << handleGATTServerEvent
21:50:07.208 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
21:50:22.360 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:50:22.360 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:50:22.398 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:50:22.398 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:22.398 -> [V][BLECharacteristic.cpp:198] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:22.398 -> [V][BLECharacteristic.cpp:646] setValue(): >> setValue: length=80, data=6161616161616161616161616161616161616161626262626262626262626262626262626262626263636363636363636363636363636363636363636464646464646464646464646464646464646464, characteristic UUID=beb5483e-36e1-4688-b7f5-ea07361b26a8
21:50:22.434 -> [D][FreeRTOS.cpp:189] take(): Semaphore taking: name: SetValue (0x3ffdddbc), owner: <N/A> for <Unknown>
21:50:22.434 -> [D][FreeRTOS.cpp:198] take(): Semaphore taken:  name: SetValue (0x3ffdddbc), owner: <Unknown>
21:50:22.434 -> [V][FreeRTOS.cpp:143] give(): Semaphore giving: name: SetValue (0x3ffdddbc), owner: <Unknown>
21:50:22.472 -> [V][BLECharacteristic.cpp:655] setValue(): << setValue
21:50:22.472 -> [D][BLECharacteristic.cpp:285] handleGATTServerEvent():  - Response to write event: New value: handle: 2a, uuid: beb5483e-36e1-4688-b7f5-ea07361b26a8
21:50:22.472 -> [D][BLECharacteristic.cpp:288] handleGATTServerEvent():  - Data: length: 80, data: 6161616161616161616161616161616161616161626262626262626262626262626262626262626263636363636363636363636363636363636363636464646464646464646464646464646464646464
21:50:22.510 -> onWrite onWrite aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd
21:50:22.510 -> [V][BLECharacteristic.cpp:452] handleGATTServerEvent(): << handleGATTServerEvent
21:50:22.510 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
21:50:22.510 -> [D][BLEDevice.cpp:102] gattServerEventHandler(): gattServerEventHandler [esp_gatt_if: 4] ... Unknown
21:50:22.510 -> [V][BLEUtils.cpp:1530] dumpGattServerEvent(): GATT ServerEvent: Unknown
21:50:22.547 -> [V][BLEUtils.cpp:1720] dumpGattServerEvent(): dumpGattServerEvent: *** NOT CODED ***
21:50:22.547 -> [V][BLEServer.cpp:144] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:22.547 -> [V][BLECharacteristic.cpp:198] handleGATTServerEvent(): >> handleGATTServerEvent: Unknown
21:50:22.547 -> [V][BLECharacteristic.cpp:452] handleGATTServerEvent(): << handleGATTServerEvent
21:50:22.547 -> [V][BLEServer.cpp:271] handleGATTServerEvent(): << handleGATTServerEvent
chegewara commented 3 years ago

Sorry, but i dont see what problem you may have. Logs seems to be correct, no crash, what do you mean by long value?

Sonnbc commented 3 years ago

Sorry, but i dont see what problem you may have. Logs seems to be correct, no crash, what do you mean by long value?

Hi @chegewara,

By long value I mean I send a string that is relatively large in size (80 characters) to the characteristic. You can see in the sketch, the Serial.printf statement should print

onWrite aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd

But instead, it printed

onWrite onWrite aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd

which is incorrect.

As I described in the reproduce part, changing the Serial.printf line fixes the problem but the two statements should be equivalent and this probably indicates that there is some memory issue here.

PS: I have changed the original post to make it a bit more clear.

chegewara commented 3 years ago

I dont think it is issue with ble, it looks like some issue with Serial.printf. To confirm it you can try for loop and print every single character from value. It is strange, because i never got issues like this.

Sonnbc commented 3 years ago

The value is definitely overwritten. I changed the code to:

class BLEManager : public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    const char* value = pCharacteristic->getValue().c_str();
    Serial.printf("onWrite %s\n", value);
    Serial.print("char printing:");
    for (int i = 0; i < strlen(value); i++) {
      Serial.print(value[i]);
    }
    Serial.println();
  }
};

And here is the log:

onWrite onWrite aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd
char printing:onWrite onWrite aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccdddddddddddddddddddd
chegewara commented 3 years ago

I dont know what to say or how to explain this. I am using BLE in many projects, but never got something like this. Even in this line it looks like 2 onWrite is appended in front, but your actual string is still the same (wrong) length: char printing:onWrite onWrite

stale[bot] commented 3 years ago

[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.

stale[bot] commented 3 years ago

[STALE_DEL] This stale issue has been automatically closed. Thank you for your contributions.