低功耗蓝牙4.0BLE编程-nrf51822开发(11)-蓝牙串口代码分析

来源:互联网 发布:java优秀开源项目 编辑:程序博客网 时间:2024/05/21 10:16

    代码实例:点击打开链接

    实现的功能是从uart口发送数据至另一个蓝牙串口,或是从蓝牙读取数据通过uart打印出数据。

   

int main(void){    // Initialize    leds_init();    timers_init();    buttons_init();    uart_init();    ble_stack_init();    gap_params_init();    services_init();    advertising_init();    conn_params_init();    sec_params_init();        simple_uart_putstring(START_STRING);        advertising_start();        // Enter main loop    for (;;)    {        power_manage();    }}


uart_init初始化uart的硬件。

当uart有数据时会进入uart中断处理:

/**@brief   Function for handling UART interrupts. * * @details This function will receive a single character from the UART and append it to a string. *          The string will be be sent over BLE when the last character received was a 'new line' *          i.e '\n' (hex 0x0D) or if the string has reached a length of @ref NUS_MAX_DATA_LENGTH. */void UART0_IRQHandler(void){    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];    static uint8_t index = 0;    uint32_t err_code;    /**@snippet [Handling the data received over UART] */    data_array[index] = simple_uart_get();    index++;    if ((data_array[index - 1] == '\n') || (index >= (BLE_NUS_MAX_DATA_LEN - 1)))    {        err_code = ble_nus_send_string(&m_nus, data_array, index + 1);        if (err_code != NRF_ERROR_INVALID_STATE)        {            APP_ERROR_CHECK(err_code);        }                index = 0;    }    /**@snippet [Handling the data received over UART] */}


data_array是数据缓冲区,当一个接收到换行符时认为是输入结束,或是达到缓冲区的最大字节数。

ble_nus_send_string函数即是把uart输入的数据通过蓝牙发送。

此实例中建立了一个服务:

/**@brief Function for initializing services that will be used by the application. */static void services_init(void){    uint32_t         err_code;    ble_nus_init_t   nus_init;        memset(&nus_init, 0, sizeof(nus_init));    nus_init.data_handler = nus_data_handler;        err_code = ble_nus_init(&m_nus, &nus_init);    APP_ERROR_CHECK(err_code);}


 

uint32_t ble_nus_init(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init){    uint32_t        err_code;    ble_uuid_t      ble_uuid;    ble_uuid128_t   nus_base_uuid = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0,                                     0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E};    if ((p_nus == NULL) || (p_nus_init == NULL))    {        return NRF_ERROR_NULL;    }        // Initialize service structure.    p_nus->conn_handle              = BLE_CONN_HANDLE_INVALID;    p_nus->data_handler             = p_nus_init->data_handler;    p_nus->is_notification_enabled  = false;        /**@snippet [Adding proprietary Service to S110 SoftDevice] */    // Add custom base UUID.    err_code = sd_ble_uuid_vs_add(&nus_base_uuid, &p_nus->uuid_type);    if (err_code != NRF_SUCCESS)    {        return err_code;    }    ble_uuid.type = p_nus->uuid_type;    ble_uuid.uuid = BLE_UUID_NUS_SERVICE;    // Add service.    err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,                                        &ble_uuid,                                        &p_nus->service_handle);    /**@snippet [Adding proprietary Service to S110 SoftDevice] */    if (err_code != NRF_SUCCESS)    {        return err_code;    }        // Add RX Characteristic.    err_code = rx_char_add(p_nus, p_nus_init);    if (err_code != NRF_SUCCESS)    {        return err_code;    }    // Add TX Characteristic.    err_code = tx_char_add(p_nus, p_nus_init);    if (err_code != NRF_SUCCESS)    {        return err_code;    }        return NRF_SUCCESS;}

rx_char_add()添加了接收特性,tx_char_add()添加了发送特性。

当从蓝牙接收到数据时,通过串口将数据打印出来:

/**@brief     Function for handling the @ref BLE_GATTS_EVT_WRITE event from the S110 SoftDevice. * * @param[in] p_dfu     Nordic UART Service structure. * @param[in] p_ble_evt Pointer to the event received from BLE stack. */static void on_write(ble_nus_t * p_nus, ble_evt_t * p_ble_evt){    ble_gatts_evt_write_t * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;        if (        (p_evt_write->handle == p_nus->rx_handles.cccd_handle)        &&        (p_evt_write->len == 2)       )    {        if (ble_srv_is_notification_enabled(p_evt_write->data))        {            p_nus->is_notification_enabled = true;        }        else        {            p_nus->is_notification_enabled = false;        }    }    else if (             (p_evt_write->handle == p_nus->tx_handles.value_handle)             &&             (p_nus->data_handler != NULL)            )    {        p_nus->data_handler(p_nus, p_evt_write->data, p_evt_write->len);    }    else    {        // Do Nothing. This event is not relevant to this service.    }}



 

0 0
原创粉丝点击