【问题标题】:Ble data sending with nrf52BLE数据发送与nrf52
【发布时间】:2021-03-29 21:43:35
【问题描述】:

我正在使用 nrf52,我为 17 字节数据数组创建了一个自定义服务,我想发送它,但它在数据更新(发送)功能时出现致命错误并重置程序。

这是我的自定义服务数据更新功能:

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); 
}}

我使用 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);


  }

}

这是我的服务字符添加

 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;
}

我收到一个错误:

nrf error_code=0x2000310c

没有关于此错误消息的信息;它抛出这个致命错误并在错误处理程序后转到nrf_breakpoint_cond 并自行重置。

请帮帮我;我尝试了我所知道的一切,但我无法继续前进。提前感谢任何试图帮助我的人。

【问题讨论】:

  • 请同时分享确切的错误信息
  • 它给出了 nrf error_code= 0x2000310c 并​​且没有关于此错误消息的信息它给出了致命错误并在错误处理程序后进入 nrf_breakpoint_cond 并自行重置我也更新了问题谢谢。
  • if (p_cus->conn_handle != BLE_CONN_HANDLE_INVALID) 否则崩溃和烧毁?这是完整的代码吗?当你编译 ble_cus_mydata_update 时,编译器告诉你什么?
  • @kefom 如果删除err_code = ble_cus_mydata_update ...这一行是否还会出现错误?
  • 如果我在 main.c 文件中注释了 err_code 部分,则它没有其他错误连接并正确宣传

标签: c bluetooth-lowenergy nrf52


【解决方案1】:

我解决了它并想帮助可能需要它的其他人它有点不同此代码用于发送 4 个字节的数据您需要对 17 个字节进行一些更改但其他代码与您的相同需要将更新功能更改为这样的东西

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;
}

【讨论】:

    【解决方案2】:

    err_code = ble_cus_mydata_update(&m_cus, *mydata_value , m_conn_handle); 不应该是err_code = ble_cus_mydata_update(&m_cus, mydata_value , m_conn_handle);吗?

    【讨论】:

    • 它不接受它像 err_code = ble_cus_mydata_update(&m_cus, mydata_value , m_conn_handle);它希望我将数据作为指针发送,或者它甚至不构建它我不知道为什么我的方式和你一样。感谢您的想法,如果您还有其他想法,我会很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多