How to improve data rate in curie Arduino 101 BLE

Hi All,

I have been trying to improve the data rate for Curie BLE. At present the time interval between two successive packets is 100 ms and the maximum data I can send in a packet is 20 Bytes so a total of 20/100ms = 200 Bytes/sec = 1.6 kbps. I have changed the default connection intervals to below
MIN_CONN_INTERVAL 0x0010
MAX_CONN_INTERVAL 0x0015
But still I am not able decrease the connection interval below 100 ms. Is there any way I can increase the data rate to above 10kbps? Can we somehow update the number of packets sent at a time ? Like increasing MTU size as the spec says BLE data rate is approx 1Mbps.

Is the data rate dependent on Central device, in my case smart phone? Is it dependent on OS(Android, iOS)? Any help is much appreciated.

Cheers,
MugiChan

Interesting, I had also assumed the connection interval settings were the limiting factor.

Are you relying on notifications, indications, or polling to read your characteristics?

FWIW, I am also seeing 100ms as the interval. One service, one characteristic.
I have a loop setting the value of a characteristic looping every 20ms... as long as there are no actual BLE transactions between devices. As soon as I use notifications or indications, ~100ms.

Samsung android, Nordic nRF Master Control panel app. App logs and Arduino serial output are in agreement on the ~100ms interval (somewhere between 97 and 100 usually to be exact).

Hi DaveOR,

Thanks for your inputs.

I am sending data via Notifications and my observation is same as yours, if I disable notifications in nRF control panel app, the time difference between two data packets is as I control. But once I start receiving notifications then the connection time interval/delay between two readings is falling to 100 ms.

From BLE side:
Is there any way we can decrease this time difference?
Or increase the data sent per packet?
Or increase the number of packets sent per connection interval?

From Central(smartphone/tablet):
Is there any way I can change the OS code to decrease the connection interval?

Hi!
I've the same problem. I use BLE UART service to communicate to a balancing robot with my smartphone. The robot works fine until I start connection with nFR toolbox app. But when BLE start working the 100ms delay makes the robot stop working.
Is it possible that BLE can't work faster? :confused:

I think it should give better throughput if you have a custom app to match your sketch to make the most of it. You may need to use some "tricks" for max throughput. The 1Mbps is a theoretical rate unlikely to be seen in most implementations as far as I'm aware. I've seen a calculation of a real world max of 125kbit/s for the Nordic assuming 6 x 20byte transfers per connection interval, and 133 connections per second (min connection interval of 7.5ms). Credit to O'Reilly publishing "Getting started with Bluetooth Low Energy" for that.

Making the Nordic available in the Arduino ecosystem may place extra overheads or limitations on that calculation. On the other hand, if anyone has attempted to write an Android app from scratch for the first time to talk with the Arduino... you may appreciate some of the tradeoffs made to make things easier to use!

Hi MugiChan!

I have the same issue with you, and figured out that after the value of max, min is adjusted, their resolution values are required to adjust accordingly. In other words, when you call MSEC_TO_UNITS method, there is one constrain for TIME and RESOLUTION as TIME/ RESOLUTION must be a interger. You might want to try the code below.

enum {
UNIT_0_200_MS = 200, /< Number of microseconds in 0.200 milliseconds. */
UNIT_0_625_MS = 625, /
< Number of microseconds in 0.625 milliseconds. */
UNIT_1_MS = 1000, /< Number of microseconds in 1 milliseconds. */
UNIT_1_25_MS = 1250, /
< Number of microseconds in 1.25 milliseconds. */
UNIT_10_MS = 10000 /**< Number of microseconds in 10 milliseconds. */
};

#define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION))

/* Connection parameters used for Peripheral Preferred Connection Parameterss (PPCP) and update request */
#define DEFAULT_MIN_CONN_INTERVAL MSEC_TO_UNITS(5, UNIT_0_625_MS)
#define DEFAULT_MAX_CONN_INTERVAL MSEC_TO_UNITS(10, UNIT_0_625_MS)

#define MIN_CONN_INTERVAL 0x0005
#define MAX_CONN_INTERVAL 0x000a