ArduinoCore-arc32 icon indicating copy to clipboard operation
ArduinoCore-arc32 copied to clipboard

Crashing when three or more characteristics are updated every 30ms?

Open Zilch123 opened this issue 7 years ago • 1 comments

Intel Curie's Tiny-Tile board crashes when three or more characteristics are updated every 30ms.

#include <CurieBLE.h>
#include <CurieIMU.h>
#define MAX_IMU_RECORD 1

typedef struct {
    int index;
    unsigned int slot[3];
} imuFrameType;

// Buffer to hold IMU data
imuFrameType imuBuf[MAX_IMU_RECORD];

unsigned seqNum = 0;

// Tx IMU data Characteristic
// remote clients will be able to
// get notifications if this characteristic changes
// standard 128-bit characteristic UUID
BLEService bleImuService("A7580001-153E-D4F6-F26D-43D8D98EEB13"); 
BLECharacteristic bleImuChar("F7580003-153E-D4F6-F26D-43D8D98EEB13", 
                             BLERead | BLENotify, sizeof(imuBuf));   
BLECharacteristic bleImuChar1("B7580003-153E-D4F6-F26D-43D8D98EEB13",
                             BLERead | BLENotify, sizeof(imuBuf));     
BLECharacteristic bleImuChar2("C7580003-153E-D4F6-F26D-43D8D98EEB13", 
                             BLERead | BLENotify, sizeof(imuBuf));   
                                                                            
void setup()
{
    Serial.begin(9600);    // initialize serial communication

    bool txpower_set = BLE.setTxPower(4);
    BLE.begin();
    CurieIMU.begin();
    BLE.setLocalName("Imu");
    BLE.setAdvertisedServiceUuid(bleImuService.uuid());// add the service UUID
    //Accelerometer sampling rate = 200Hz
    CurieIMU.setAccelerometerRate(200);
    //Minimum, Maximum connection interval 7.5ms- 10ms 
    //(0x06=7.5/1.25, 0x08= 10/1.25)//0x028=50/1.25 
    BLE.setConnectionInterval(0x06,0x28);
    BLE.addService(bleImuService);   // Add the Imu service
    bleImuService.addCharacteristic(bleImuChar); // add the Imu characteristic
    bleImuService.addCharacteristic(bleImuChar1);
    bleImuService.addCharacteristic(bleImuChar2);
    BLE.advertise();
}

void loop()
{
    // listen for BLE peripherals to connect:
    // Since we are a peripheral we need a central object to connect to
    BLEDevice central = BLE.central();
    BLE.poll();
    // if a central is connected to peripheral:
    if (central)
    {
        long currentMillis, sentTime;
        // Send IMU data as long as the central is still connected
        currentMillis = sentTime = millis();
        while (central.connected())
        {
          while(bleImuChar.canNotify()&bleImuChar1.canNotify()&bleImuChar2.canNotify())
          {
            // Take IMU data every 25 msec
            if ((millis() - sentTime) >= 33)
            {
                    for(int i=0; i<=2; i++)
                    {
                      //Reads acc data
                      recordImuData(i);
                      delay(10);
                    }
                    delay(2);
                    // Sets Tx buffer to the read acc data
                    bleImuChar.setValue((unsigned char *)&(imuBuf[0]), sizeof(imuBuf[0])); 
                    bleImuChar1.setValue((unsigned char *)&(imuBuf[1]), sizeof(imuBuf[1]));
                    bleImuChar2.setValue((unsigned char *)&(imuBuf[2]), sizeof(imuBuf[2]));
                    
                    sentTime = millis();  //note what time data was sent 
                    for(int j=0;j<=1;j++)
                    {
                      for(int k=0; k<=2; k++)
                      {
                        Serial.println(imuBuf[j].slot[k]);
                        imuBuf[j].slot[k]=0; 
                      }
                    }
                    
                   
             }//end of if( time> update time) loop
            } // end of While( The Char.CanNotify())loop
          } //end of While(central.connnected()) loop
       } // end of if(central) loop
    }

// This function records the IMU data that we send to the central 
void recordImuData(int index)
{
    /* Read IMU data.
    */
    int ax, ay, az;
    int gx, gy, gz;

    imuBuf[index].index = seqNum++;
    CurieIMU.readAccelerometer(ax, ay, az);
    //ax=10;
    //Serial.println(ax);
        // Encode the data into the buffer
    imuBuf[index].slot[0] = (unsigned int)(ax);
    imuBuf[index].slot[1] = (unsigned int)(ay);
    imuBuf[index].slot[2] = (unsigned int)(az);

}

Zilch123 avatar Oct 24 '18 06:10 Zilch123

Hi! @facchinm, can you please point out the mistake in the above code?

Zilch123 avatar Oct 26 '18 05:10 Zilch123