This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Send Bluetooth Data Continuously

I'm not sure if what I am trying to do is the proper way to send ble data, and I since I can't get it to work, I'm assuming I'm doing it wrong. What I'm trying to do is send data to a BLE central device (my phone) using a peripheral. after initializing everything I can send and receive data from a serial port monitor just fine. The code below is what grabs the serial port data and sends it to the central device.

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void uart_event_handle(app_uart_evt_t *p_event) {
static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
static uint8_t index = 0;
uint32_t err_code;
switch (p_event->evt_type) {
case APP_UART_DATA_READY:
UNUSED_VARIABLE(app_uart_get(&data_array[index]));
index++;
if ((data_array[index - 1] == '\n') ||
(data_array[index - 1] == '\r') ||
(index >= m_ble_nus_max_data_len)) {
if (index > 1) {
printf("\n\n\n\rReady to send data over BLE NUS.");
NRF_LOG_DEBUG("Ready to send data over BLE NUS");
printf("\n\rm_conn_handle = %d", m_conn_handle);
NRF_LOG_HEXDUMP_DEBUG(data_array, index);
do {
uint16_t length = (uint16_t)index;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

I thought that I could take the same concept to send data from the main method. after initializing, I put the following code, which (I thought) sent "Hello\n" every 2.5 seconds. instead, "m_conn_handle" = 0xFFFF and it never transmits data. NOTE: I am connected to the device via my phone which I thought should change that value to 0x0000. I know the code is rough but I just wanted to make sure I could send data correctly before I went any further. And I can't.

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while (1) {
static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
data_array[0] = 'H';
data_array[1] = 'e';
data_array[2] = 'l';
data_array[3] = 'l';
data_array[4] = 'o';
data_array[5] = '\n';
ret_code_t err_code = 0;
uint8_t index = 6;
printf("\n\rm_conn_handle = %d", m_conn_handle);
if ((data_array[index - 1] == '\n') ||
(data_array[index - 1] == '\r') ||
(index >= m_ble_nus_max_data_len)) {
if (index > 1) {
printf("\n\rGonna broadcast now!");
NRF_LOG_DEBUG("Gonna broadcast now?");
NRF_LOG_HEXDUMP_DEBUG(data_array, index);
do {
uint16_t length = (uint16_t)index;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

If anyone knows what I need to do to get it to send data, that would be greatly appreciated.

On a similar note, I am able to process that data from the central that I am receiving on the peripheral using the static void nus_data_handler(ble_nus_evt_t *pevt) function as follows.

Fullscreen
1
2
3
4
5
6
7
8
9
10
static void nus_data_handler(ble_nus_evt_t *p_evt) {
if (p_evt->type == BLE_NUS_EVT_RX_DATA) {
if(p_evt->params.rx_data.p_data[0] == 'V') {
uint16_t value = p_evt->params.rx_data.p_data[1] << 8 | p_evt->params.rx_data.p_data[2];
printf("\n\rSetting Value to %d\n\r", value);
write_value(value);
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Is this the proper way to read the value being received? It works fine, but that doesn't mean I'm doing it right.