Go Down

Topic: Arduino 101 BLE stop working (Read 393 times) previous topic - next topic

drkmr92

Hi All,

I'm ussing my arduino 101 to send a 20 bytes long vector over BLE, i'm ussing an timer to interrupt every 30 ms, and everything works but, when i set a lower time like 20ms, ble send some bytes then stop working until i reset, i also I've realized that happens even if I only send 1 byte, also i've use a delay instead of timer interrupt but no luck at all, i'm ussing Arduino 101 board, Arduno IDE 1.8.5 (Ubuntu), and the latest Arduino 101 Core (2.0.2), i use as central a computer with GATTOOL and Bluez in ubuntu, and nRF Connect for Mobile App in Android 7.1.2.

here is my code:

Code: [Select]
//======================================================================================================================
//Arduino 101 CurieBLE implementation as peripheral device,
//sent 20 Bytes when timer reach a certain time, given by time variable
//by drkmr92
//======================================================================================================================

#include <CurieBLE.h> //Include BLE library
#include <CurieTimerOne.h> //Include Timer Library

int time=20000;   //To Set timer Interrupt time

#define buff_length  20 //transmit buffer lenght XD

BLEService TX_test("03B80E5A-EDE8-4B33-A751-6CE34EC4C700"); //UUID

BLECharacteristic Send_Array("7772E5DB-3868-4112-A1A9-F2669D106BF3",BLENotify | BLERead,buff_length);
//Notify an read, 20 bytes long
//Note: i use the same UUID and characteristic than in MIDIBLE example

//Variables
uint8_t buff[buff_length], i=0, cont=0; //Hold transmit buffer data
bool Cflag=false;  //Connection Flag, True when connected, false when not

void setup(){ //Main
    BLE.begin(); //Ble init

    BLE.setLocalName("CURIE");  //name that will be displayed
    BLE.setDeviceName("CURIE"); //It will be the same name to work with .NET library else it will not be recognized
 
    BLE.setAdvertisedServiceUuid(TX_test.uuid()); //Add UUID

    TX_test.addCharacteristic(Send_Array);

    BLE.addService(TX_test);

    BLE.setEventHandler(BLEConnected, deviceConnectHandler);    //Add an interrupt function when Central is connected

    BLE.setEventHandler(BLEDisconnected, deviceDisconnectHandler); //Add an interrupt function when Central is disconnected

    Send_Array.setValue(buff,buff_length); //Set Characteristic Value to 0

    pinMode(13,OUTPUT); //enable LED_PIN(13) to turn on/off

    Cflag=false;    //Initialize Connectection Flag to Disconnected(false)

    BLE.advertise();  //Start advertise BLE service

    CurieTimerOne.start(time, &Timer_ISR);  //Add function to Timer interrupt and set Time
}

void loop(){    //infinite loop
    BLE.poll();
}

void deviceConnectHandler(BLEDevice central) {//turn a led when central is connect and enable connection flag(Cflag)
  // central connected event handler
    digitalWrite(13,HIGH);
    Cflag=true;
}

void deviceDisconnectHandler(BLEDevice central) {//turn a led when central is disconnect and disable connection flag(Cflag)
  // central disconnected event handler
    digitalWrite(13,LOW);
    Cflag=false;
}

void Timer_ISR(){   //fill buffer with increasing numbers
    if(Cflag){
        for(i=0;i<sizeof(buff);i++){
            buff[i]=cont;
            cont++;
        }
        Send_Array.setValue(buff,buff_length); //set charactersitic value to buff and notify
    }
}


In ubuntu i get something like this, then stop suddenly, as you can notice i'm not loosing any byte after it stop working.

Code: [Select]
Notification handle = 0x000b value: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01 02 03
Notification handle = 0x000b value: 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17
Notification handle = 0x000b value: 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b
Notification handle = 0x000b value: 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
Notification handle = 0x000b value: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53
Notification handle = 0x000b value: 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67
Notification handle = 0x000b value: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b
Notification handle = 0x000b value: 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f
Notification handle = 0x000b value: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3
Notification handle = 0x000b value: a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7
Notification handle = 0x000b value: b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb
Notification handle = 0x000b value: cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df
Notification handle = 0x000b value: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3
Notification handle = 0x000b value: f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01 02 03 04 05 06 07
Notification handle = 0x000b value: 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b
Notification handle = 0x000b value: 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
Notification handle = 0x000b value: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43
Notification handle = 0x000b value: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57
Notification handle = 0x000b value: 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b
Notification handle = 0x000b value: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
Notification handle = 0x000b value: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93
Notification handle = 0x000b value: 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7
Notification handle = 0x000b value: a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb


I don't know if is something wrong in my code, i do my calculations and at least i'd be able to send at least with 10ms between each vector.

Sorry for my bad english.  :smiley-roll-sweat:

Thanks in advance.

Go Up