Search code examples
cbluetooth-lowenergynrf52

Ble data sending with nrf52


I am working with nrf52 and I made a custom service for 17 bytes data array and I want to send it but it gives fatal error while in data update (sending) function and resets the program.

Here's my custom service data update function:

uint32_t ble_cus_mydata_update(ble_cus_t * p_cus, uint8_array_t mydata, uint16_t conn_handle)
{

if (p_cus->conn_handle != BLE_CONN_HANDLE_INVALID)
{
    ble_gatts_hvx_params_t params;

memset(&params, 0, sizeof(params));
params.type   = BLE_GATT_HVX_NOTIFICATION;
params.handle = p_cus->mydata_char_handles.value_handle;
params.p_data = &mydata;
params.p_len  = 17;

return sd_ble_gatts_hvx(conn_handle, &params); 
}}

and i send data with timeout_handler

static void mydata_timeout_handler(void * p_context)

{
    ret_code_t      err_code;

    UNUSED_PARAMETER(p_context);

bsp_board_led_on(2);
nrf_delay_ms(100);
bsp_board_led_off(2);


uint8_array_t mydata_value [17] = {0x55,0x10,0x01,0x23,0x99,0xFF,0xFF,0xCC,0xBB,0x00,0x00,0x00,0x00,0x00,0x24,0x24,0x20};
err_code = ble_cus_mydata_update(&m_cus, *mydata_value , m_conn_handle);

if ((err_code != NRF_SUCCESS) &&
    (err_code != NRF_ERROR_INVALID_STATE) &&
    (err_code != NRF_ERROR_RESOURCES) &&
    (err_code != NRF_ERROR_BUSY) &&
    (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
   )
{
    APP_ERROR_HANDLER(err_code);


  }

}

And here is my service char add

 uint8_array_t mydata_char_init_value [17] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

memset(&add_char_params, 0, sizeof(add_char_params));
add_char_params.uuid              = MYDATA_CHAR_UUID;
add_char_params.uuid_type         = p_cus->uuid_type;

add_char_params.init_len          = 17;
add_char_params.max_len           = 17;
add_char_params.p_init_value      = mydata_char_init_value;

add_char_params.char_props.read   = 1;
add_char_params.char_props.notify = 1;

add_char_params.read_access       = SEC_OPEN;
add_char_params.cccd_write_access = SEC_OPEN;

err_code = characteristic_add(p_cus->service_handle,
                              &add_char_params,
                              &p_cus->mydata_char_handles);
if (err_code != NRF_SUCCESS)
{
    return err_code;
}

I get an error:

nrf error_code= 0x2000310c

There is no info about this error message; it throws this fatal error and goes to nrf_breakpoint_cond after error handler and resets itself.

Please help me; I tried everything I know and I can't move forward. Thanks in advance to whomever tries to help me.


Solution

  • i solved it and wanted to help others who might need it its a little different this code is for sending 4 bytes of data you need to do a little changes for 17 bytes but its not that much the other codes are same you just need to change update function to something like this

    uint32_t ble_cus_pres_level_update(ble_cus_t * p_cus, uint32_t presvalue)
        {
        //    NRF_LOG_INFO("In ble_cus_presvalue_update. \r\n"); 
            if (p_cus == NULL)
            {
                return NRF_ERROR_NULL;
            }
    
        uint32_t err_code = NRF_SUCCESS;
        ble_gatts_value_t gatts_value;
    
        // Initialize value struct.
        memset(&gatts_value, 0, sizeof(gatts_value));
    
        gatts_value.len     = sizeof(uint32_t);
        gatts_value.offset  = 0;
        gatts_value.p_value = &presvalue;
    
        // Update database.
        err_code = sd_ble_gatts_value_set(p_cus->conn_handle,
                                          p_cus->bme280_presvalue_char_handles.value_handle,
                                          &gatts_value);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
     // Send value if connected and notifying.
    
    if (p_cus->conn_handle != BLE_CONN_HANDLE_INVALID)
    {
        ble_gatts_hvx_params_t params;
    
        memset(&params, 0, sizeof(params));
        params.type   = BLE_GATT_HVX_NOTIFICATION;
        params.handle = p_cus->bme280_presvalue_char_handles.value_handle;
        params.offset = gatts_value.offset;
        params.p_data = gatts_value.p_value;
        params.p_len  = &gatts_value.len;
    
            err_code = sd_ble_gatts_hvx(p_cus->conn_handle, &params);
    //        NRF_LOG_INFO("sd_ble_gatts_hvx result: %x. \r\n", err_code); 
        }
        else
        {
            err_code = NRF_ERROR_INVALID_STATE;
    //        NRF_LOG_INFO("sd_ble_gatts_hvx result: NRF_ERROR_INVALID_STATE. \r\n"); 
        }
    
    
        return err_code;
    }