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

how to use uart to send bigdata

The computer and the 52832 are connected through a serial port. I want to send 2Kb data to my computer. But my computer can only receive 256b data. What should I do?

Parents Reply Children
  • Thank you for your answer. I'm a newbie and I hope you can read my code. I can only receive part of the data. what should I do? Thanks again!

    /**
     * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA
     * 
     * All rights reserved.
     * 
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted provided that the following conditions are met:
     * 
     * 1. Redistributions of source code must retain the above copyright notice, this
     *    list of conditions and the following disclaimer.
     * 
     * 2. Redistributions in binary form, except as embedded into a Nordic
     *    Semiconductor ASA integrated circuit in a product or a software update for
     *    such product, must reproduce the above copyright notice, this list of
     *    conditions and the following disclaimer in the documentation and/or other
     *    materials provided with the distribution.
     * 
     * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
     *    contributors may be used to endorse or promote products derived from this
     *    software without specific prior written permission.
     * 
     * 4. This software, with or without modification, must only be used with a
     *    Nordic Semiconductor ASA integrated circuit.
     * 
     * 5. Any software provided in binary form under this license must not be reverse
     *    engineered, decompiled, modified and/or disassembled.
     * 
     * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     * 
     */
    #include <stdio.h>
    #include <stdint.h>
    #include <stdbool.h>
    #include "nordic_common.h"
    #include "app_error.h"
    #include "app_uart.h"
    #include "ble_db_discovery.h"
    #include "app_timer.h"
    #include "app_util.h"
    #include "bsp_btn_ble.h"
    #include "ble.h"
    #include "ble_gap.h"
    #include "ble_hci.h"
    #include "nrf_sdh.h"
    #include "nrf_sdh_ble.h"
    #include "nrf_sdh_soc.h"
    #include "nrf_pwr_mgmt.h"
    #include "ble_advdata.h"
    #include "ble_nus_c.h"
    #include "nrf_ble_gatt.h"
    
    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    #include "nrf_log_default_backends.h"
    #include "app_timer.h"
    
    #include "atcmd.h"
    
    #include "es_battery_voltage.h"
    #include "app_fifo.h"
    #include "nrf_delay.h"
    
    
    #define APP_BLE_CONN_CFG_TAG    1                                       /**< A tag that refers to the BLE stack configuration we set with @ref sd_ble_cfg_set. Default tag is @ref BLE_CONN_CFG_TAG_DEFAULT. */
    #define APP_BLE_OBSERVER_PRIO   3                                       /**< Application's BLE observer priority. You shoulnd't need to modify this value. */
    
    #define UART_TX_BUF_SIZE        256                                     /**< UART TX buffer size. */
    #define UART_RX_BUF_SIZE        256                                     /**< UART RX buffer size. */
    
    #define NUS_SERVICE_UUID_TYPE   BLE_UUID_TYPE_VENDOR_BEGIN              /**< UUID type for the Nordic UART Service (vendor specific). */
    
    #define SCAN_INTERVAL           0x4000                                  /**< Determines scan interval in units of 0.625 millisecond. */
    #define SCAN_WINDOW             0x4000                                /**< Determines scan window in units of 0.625 millisecond. */
    #define SCAN_TIMEOUT            0x0000                                   /**< Timout when scanning. 0x0000 disables timeout. */
    
    #define MIN_CONNECTION_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS)         /**< Determines minimum connection interval in millisecond. */
    #define MAX_CONNECTION_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS)         /**< Determines maximum connection interval in millisecond. */
    #define SLAVE_LATENCY           0                                       /**< Determines slave latency in counts of connection events. */
    #define SUPERVISION_TIMEOUT     MSEC_TO_UNITS(4000, UNIT_10_MS)         /**< Determines supervision time-out in units of 10 millisecond. */
    
    #define UUID16_SIZE             2                                       /**< Size of 16 bit UUID */
    #define UUID32_SIZE             4                                       /**< Size of 32 bit UUID */
    #define UUID128_SIZE            16                                      /**< Size of 128 bit UUID */
    
    #define ECHOBACK_BLE_UART_DATA  1                                       /**< Echo the UART data that is received over the Nordic UART Service back to the sender. */
    
    #define SCAN_RES_MAX			300
    
    BLE_NUS_C_DEF(m_ble_nus_c);                                             /**< BLE NUS service client instance. */
    NRF_BLE_GATT_DEF(m_gatt);                                               /**< GATT module instance. */
    BLE_DB_DISCOVERY_DEF(m_db_disc);                                        /**< DB discovery module instance. */
    
    static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - OPCODE_LENGTH - HANDLE_LENGTH; /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
    
    
    APP_TIMER_DEF(m_scan_timer_id1);
    APP_TIMER_DEF(m_scan_timer_id2);
    
    uint8_t num = 0;		
    bool isScanning = false; 
    uint16_t scanTime1 = 2000;
    
    
    #define SCAN_TIMER_INTERVAL1            APP_TIMER_TICKS(scanTime1)
    #define SCAN_TIMER_WINDOW            APP_TIMER_TICKS(3000)
    
    void printfScan(void);
    
    app_uart_comm_params_t const comm_params =
    {
    	.rx_pin_no    = RX_PIN_NUMBER,
    	.tx_pin_no    = TX_PIN_NUMBER,
    	.rts_pin_no   = RTS_PIN_NUMBER,
    	.cts_pin_no   = CTS_PIN_NUMBER,
    	.flow_control = APP_UART_FLOW_CONTROL_DISABLED,
    	.use_parity   = false,
    	.baud_rate    = UART_BAUDRATE_BAUDRATE_Baud9600
    };
    
    typedef struct Data
    {
    	char      name[20];
    	char      mac[12];
    	char      rssi;
    	int 	  major;
    	int      minor;
    }Data;
    
    Data scanData[SCAN_RES_MAX];
    /**@brief Connection parameters requested for connection. */
    static ble_gap_conn_params_t const m_connection_param1 =
    {
        (uint16_t)MIN_CONNECTION_INTERVAL,  // Minimum connection
        (uint16_t)MAX_CONNECTION_INTERVAL,  // Maximum connection
        (uint16_t)SLAVE_LATENCY,            // Slave latency
        (uint16_t)SUPERVISION_TIMEOUT       // Supervision time-out
    };
    
    /** @brief Parameters used when scanning. */
    static ble_gap_scan_params_t const m_scan_params =
    {
        .active   = 1,
        .interval = SCAN_INTERVAL,
        .window   = SCAN_WINDOW,
        .timeout  = SCAN_TIMEOUT,
        #if (NRF_SD_BLE_API_VERSION <= 2)
            .selective   = 0,
            .p_whitelist = NULL,
        #endif
        #if (NRF_SD_BLE_API_VERSION >= 3)
            .use_whitelist = 0,
        #endif
    };
    
    /**@brief NUS uuid. */
    static ble_uuid_t const m_nus_uuid =
    {
        .uuid = BLE_UUID_NUS_SERVICE,
        .type = NUS_SERVICE_UUID_TYPE
    };
    
    
    /**@brief Function for asserts in the SoftDevice.
     *
     * @details This function will be called in case of an assert in the SoftDevice.
     *
     * @warning This handler is an example only and does not fit a final product. You need to analyze
     *          how your product is supposed to react in case of Assert.
     * @warning On assert from the SoftDevice, the system can only recover on reset.
     *
     * @param[in] line_num     Line number of the failing ASSERT call.
     * @param[in] p_file_name  File name of the failing ASSERT call.
     */
    void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
    {
        app_error_handler(0xDEADBEEF, line_num, p_file_name);
    }
    
    
    /**@brief Function to start scanning. */
    void scan_start(void)
    {
        ret_code_t ret;
    	
        ret = sd_ble_gap_scan_start(&m_scan_params);
        APP_ERROR_CHECK(ret);
    	isScanning = true;
    	
    }
    
    
    /**@brief Function for handling database discovery events.
     *
     * @details This function is callback function to handle events from the database discovery module.
     *          Depending on the UUIDs that are discovered, this function should forward the events
     *          to their respective services.
     *
     * @param[in] p_event  Pointer to the database discovery event.
     */
    static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
    {
        ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
    }
    
    
    /**@brief Function for handling characters received by the Nordic UART Service.
     *
     * @details This function takes a list of characters of length data_len and prints the characters out on UART.
     *          If @ref ECHOBACK_BLE_UART_DATA is set, the data is sent back to sender.
     */
    static void ble_nus_chars_received_uart_print(uint8_t * p_data, uint16_t data_len)
    {
        ret_code_t ret_val;
    
        NRF_LOG_DEBUG("Receiving data.");
        NRF_LOG_HEXDUMP_DEBUG(p_data, data_len);
    
        for (uint32_t i = 0; i < data_len; i++)
        {
            do
            {
                ret_val = app_uart_put(p_data[i]);
                if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
                {
                    NRF_LOG_ERROR("app_uart_put failed for index 0x%04x.", i);
                    APP_ERROR_CHECK(ret_val);
                }
            } while (ret_val == NRF_ERROR_BUSY);
        }
        if (p_data[data_len-1] == '\r')
        {
            while (app_uart_put('\n') == NRF_ERROR_BUSY);
        }
        if (ECHOBACK_BLE_UART_DATA)
        {
            // Send data back to peripheral.
            do
            {
                ret_val = ble_nus_c_string_send(&m_ble_nus_c, p_data, data_len);
                if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
                {
                    NRF_LOG_ERROR("Failed sending NUS message. Error 0x%x. ", ret_val);
                    APP_ERROR_CHECK(ret_val);
                }
            } while (ret_val == NRF_ERROR_BUSY);
        }
    }
    
    
    /**@brief   Function for handling app_uart events.
     *
     * @details This function will receive a single character from the app_uart module and append it to
     *          a string. The string will be be sent over BLE when the last character received was a
     *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
     */
    void uart_event_handle(app_uart_evt_t * p_event)
    {
        static uint8_t data_array[UART_RX_BUF_SIZE];
        static uint16_t index = 0;
    
        switch (p_event->evt_type)
        {
            /**@snippet [Handling data from UART] */
            case APP_UART_DATA_READY:
                UNUSED_VARIABLE(app_uart_get(&data_array[index]));
                index++;
    
                if ((data_array[index - 1] == '\n') )
                {
                    
    				if(UAart_Command(data_array) == 0)
                    {
    					printf("command error!\r\n");
    				}
                    index = 0;
                }
                break;
    
            /**@snippet [Handling data from UART] */
            case APP_UART_COMMUNICATION_ERROR:
                NRF_LOG_ERROR("Communication error occurred while handling UART.");
                APP_ERROR_HANDLER(p_event->data.error_communication);
                break;
    
            case APP_UART_FIFO_ERROR:
                NRF_LOG_ERROR("Error occurred in FIFO module used by UART.");
                APP_ERROR_HANDLER(p_event->data.error_code);
                break;
    
            default:
                break;
        }
    }
    
    
    /**@brief Callback handling NUS Client events.
     *
     * @details This function is called to notify the application of NUS client events.
     *
     * @param[in]   p_ble_nus_c   NUS Client Handle. This identifies the NUS client
     * @param[in]   p_ble_nus_evt Pointer to the NUS Client event.
     */
    
    /**@snippet [Handling events from the ble_nus_c module] */
    static void ble_nus_c_evt_handler(ble_nus_c_t * p_ble_nus_c, ble_nus_c_evt_t const * p_ble_nus_evt)
    {
        ret_code_t err_code;
    
        switch (p_ble_nus_evt->evt_type)
        {
            case BLE_NUS_C_EVT_DISCOVERY_COMPLETE:
                NRF_LOG_INFO("Discovery complete.");
                err_code = ble_nus_c_handles_assign(p_ble_nus_c, p_ble_nus_evt->conn_handle, &p_ble_nus_evt->handles);
                APP_ERROR_CHECK(err_code);
    
                err_code = ble_nus_c_tx_notif_enable(p_ble_nus_c);
                APP_ERROR_CHECK(err_code);
                NRF_LOG_INFO("Connected to device with Nordic UART Service.");
                break;
    
            case BLE_NUS_C_EVT_NUS_TX_EVT:
                ble_nus_chars_received_uart_print(p_ble_nus_evt->p_data, p_ble_nus_evt->data_len);
                break;
    
            case BLE_NUS_C_EVT_DISCONNECTED:
                NRF_LOG_INFO("Disconnected.");
                scan_start();
                break;
        }
    }
    
    /**
     * @brief Function for shutdown events.
     *
     * @param[in]   event       Shutdown type.
     */
    static bool shutdown_handler(nrf_pwr_mgmt_evt_t event)
    {
        ret_code_t err_code;
    
        err_code = bsp_indication_set(BSP_INDICATE_IDLE);
        APP_ERROR_CHECK(err_code);
    
        switch (event)
        {
            case NRF_PWR_MGMT_EVT_PREPARE_WAKEUP:
                // Prepare wakeup buttons.
                err_code = bsp_btn_ble_sleep_mode_prepare();
                APP_ERROR_CHECK(err_code);
                break;
    
            default:
                break;
        }
    
        return true;
    }
    
    NRF_PWR_MGMT_HANDLER_REGISTER(shutdown_handler, APP_SHUTDOWN_HANDLER_PRIORITY);
    
    /**@brief Reads an advertising report and checks if a UUID is present in the service list.
     *
     * @details The function is able to search for 16-bit, 32-bit and 128-bit service UUIDs.
     *          To see the format of a advertisement packet, see
     *          https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm
     *
     * @param[in]   p_target_uuid The UUID to search for.
     * @param[in]   p_adv_report  Pointer to the advertisement report.
     *
     * @retval      true if the UUID is present in the advertisement report. Otherwise false
     */
    static bool is_uuid_present(ble_uuid_t               const * p_target_uuid,
                                ble_gap_evt_adv_report_t const * p_adv_report)
    {
        ret_code_t   err_code;
        ble_uuid_t   extracted_uuid;
        uint16_t     index  = 0;
        uint8_t    * p_data = (uint8_t *)p_adv_report->data;
    
        while (index < p_adv_report->dlen)
        {
            uint8_t field_length = p_data[index];
            uint8_t field_type   = p_data[index + 1];
    
            if (   (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE)
                || (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE))
            {
                for (uint32_t i = 0; i < (field_length / UUID16_SIZE); i++)
                {
                    err_code = sd_ble_uuid_decode(UUID16_SIZE,
                                                  &p_data[i * UUID16_SIZE + index + 2],
                                                  &extracted_uuid);
    
                    if (err_code == NRF_SUCCESS)
                    {
                        if (extracted_uuid.uuid == p_target_uuid->uuid)
                        {
                            return true;
                        }
                    }
                }
            }
            else if (   (field_type == BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE)
                     || (field_type == BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE))
            {
                for (uint32_t i = 0; i < (field_length / UUID32_SIZE); i++)
                {
                    err_code = sd_ble_uuid_decode(UUID32_SIZE,
                                                  &p_data[i * UUID32_SIZE + index + 2],
                                                  &extracted_uuid);
    
                    if (err_code == NRF_SUCCESS)
                    {
                        if (   (extracted_uuid.uuid == p_target_uuid->uuid)
                            && (extracted_uuid.type == p_target_uuid->type))
                        {
                            return true;
                        }
                    }
                }
            }
    
            else if (   (field_type == BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE)
                     || (field_type == BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE))
            {
                err_code = sd_ble_uuid_decode(UUID128_SIZE, &p_data[index + 2], &extracted_uuid);
                if (err_code == NRF_SUCCESS)
                {
                    if (   (extracted_uuid.uuid == p_target_uuid->uuid)
                        && (extracted_uuid.type == p_target_uuid->type))
                    {
                        return true;
                    }
                }
            }
            index += field_length + 1;
        }
        return false;
    }
    
    
    /**@brief Function for handling BLE events.
     *
     * @param[in]   p_ble_evt   Bluetooth stack event.
     * @param[in]   p_context   Unused.
     */
    static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
    {
        ret_code_t            err_code;
        ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;
    
        switch (p_ble_evt->header.evt_id)
        {
            case BLE_GAP_EVT_ADV_REPORT:
            {
    			uint8_t index = 0;
    			
    			bool flag = false;
    			ble_gap_evt_adv_report_t const * p_adv_report = &p_gap_evt->params.adv_report;
    			if(p_adv_report->scan_rsp == 0)
    			{
    				for(int i = 0; i < num; i ++)
    				{
    					if(strcmp(scanData[i].mac,p_adv_report->peer_addr.addr) == 0)
    					{
    						flag = true;
    						scanData[i].rssi = (uint8_t)(-p_adv_report->rssi);
    						break;
    					}
    				}
    				if(flag == false)
    				{
    					while(index < (p_adv_report->dlen) )
    					{
    					  if(((uint8_t)(p_adv_report->data[index+1])) != 0x09 )
    					  {
    						index = index + (p_adv_report->data[index]) + 1;
    					  }
    					  else
    					  {
    						uint8_t a = 0; 
    						for(a = 0; a <  ((uint8_t)(p_adv_report->data[index]) - 1); a++)
    						{
    							scanData[num].name[a] = p_adv_report->data[index + 2 + a];
    						}
    						break;
    					  }
    					}
    					scanData[num].rssi = (uint8_t)(-p_adv_report->rssi);
    					scanData[num].major = p_adv_report->data[25]*10+p_adv_report->data[26];
    					scanData[num].minor = p_adv_report->data[27]*10+p_adv_report->data[28];
    					strcpy(scanData[num++].mac,p_adv_report->peer_addr.addr);
    					
    				}
    					
    			}
    				
    			
            }break; // BLE_GAP_EVT_ADV_REPORT
    
            case BLE_GAP_EVT_CONNECTED:
                NRF_LOG_INFO("Connected to target");
                err_code = ble_nus_c_handles_assign(&m_ble_nus_c, p_ble_evt->evt.gap_evt.conn_handle, NULL);
                APP_ERROR_CHECK(err_code);
    
                err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
                APP_ERROR_CHECK(err_code);
    
                // start discovery of services. The NUS Client waits for a discovery result
                err_code = ble_db_discovery_start(&m_db_disc, p_ble_evt->evt.gap_evt.conn_handle);
                APP_ERROR_CHECK(err_code);
                break;
    
            case BLE_GAP_EVT_TIMEOUT:
    			
                if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_SCAN)
                {
                    NRF_LOG_INFO("Scan timed out.");
                    scan_start();
                }
                else if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)
                {
                    NRF_LOG_INFO("Connection Request timed out.");
                }
                break;
    
            case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
                // Pairing not supported
                err_code = sd_ble_gap_sec_params_reply(p_ble_evt->evt.gap_evt.conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
                APP_ERROR_CHECK(err_code);
                break;
    
            case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
                // Accepting parameters requested by peer.
                err_code = sd_ble_gap_conn_param_update(p_gap_evt->conn_handle,
                                                        &p_gap_evt->params.conn_param_update_request.conn_params);
                APP_ERROR_CHECK(err_code);
                break;
    
    #ifndef S140
            case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
            {
                NRF_LOG_DEBUG("PHY update request.");
                ble_gap_phys_t const phys =
                {
                    .rx_phys = BLE_GAP_PHY_AUTO,
                    .tx_phys = BLE_GAP_PHY_AUTO,
                };
                err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
                APP_ERROR_CHECK(err_code);
            } break;
    #endif
    
            case BLE_GATTC_EVT_TIMEOUT:
                // Disconnect on GATT Client timeout event.
                NRF_LOG_DEBUG("GATT Client Timeout.");
                err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
                                                 BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
                APP_ERROR_CHECK(err_code);
                break;
    
            case BLE_GATTS_EVT_TIMEOUT:
                // Disconnect on GATT Server timeout event.
                NRF_LOG_DEBUG("GATT Server Timeout.");
                err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
                                                 BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
                APP_ERROR_CHECK(err_code);
                break;
    
            default:
                break;
        }
    }
    
    
    /**@brief Function for initializing the BLE stack.
     *
     * @details Initializes the SoftDevice and the BLE event interrupt.
     */
    static void ble_stack_init(void)
    {
        ret_code_t err_code;
    
        err_code = nrf_sdh_enable_request();
        APP_ERROR_CHECK(err_code);
    
        // Configure the BLE stack using the default settings.
        // Fetch the start address of the application RAM.
        uint32_t ram_start = 0;
        err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
        APP_ERROR_CHECK(err_code);
    
        // Enable BLE stack.
        err_code = nrf_sdh_ble_enable(&ram_start);
        APP_ERROR_CHECK(err_code);
    
        // Register a handler for BLE events.
        NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
    }
    
    
    /**@brief Function for handling events from the GATT library. */
    void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
    {
        if (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED)
        {
            NRF_LOG_INFO("ATT MTU exchange completed.");
    
            m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
            NRF_LOG_INFO("Ble NUS max data length set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
        }
    }
    
    
    /**@brief Function for initializing the GATT library. */
    void gatt_init(void)
    {
        ret_code_t err_code;
    
        err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
        APP_ERROR_CHECK(err_code);
    
        err_code = nrf_ble_gatt_att_mtu_central_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
        APP_ERROR_CHECK(err_code);
    }
    
    
    /**@brief Function for handling events from the BSP module.
     *
     * @param[in] event  Event generated by button press.
     */
    void bsp_event_handler(bsp_event_t event)
    {
        ret_code_t err_code;
    
        switch (event)
        {
            case BSP_EVENT_SLEEP:
                nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
                break;
    
            case BSP_EVENT_DISCONNECT:
                err_code = sd_ble_gap_disconnect(m_ble_nus_c.conn_handle,
                                                 BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
                if (err_code != NRF_ERROR_INVALID_STATE)
                {
                    APP_ERROR_CHECK(err_code);
                }
                break;
    
            default:
                break;
        }
    }
    
    /**@brief Function for initializing the UART. */
    void uart_init(void)
    {
        ret_code_t err_code;
        APP_UART_FIFO_INIT(&comm_params,
                           UART_RX_BUF_SIZE,
                           UART_TX_BUF_SIZE,
                           uart_event_handle,
                           APP_IRQ_PRIORITY_LOWEST,
                           err_code);
    
        APP_ERROR_CHECK(err_code);
    }
    
    /**@brief Function for initializing the NUS Client. */
    static void nus_c_init(void)
    {
        ret_code_t       err_code;
        ble_nus_c_init_t init;
    
        init.evt_handler = ble_nus_c_evt_handler;
    
        err_code = ble_nus_c_init(&m_ble_nus_c, &init);
        APP_ERROR_CHECK(err_code);
    }
    
    
    /**@brief Function for initializing buttons and leds. */
    static void buttons_leds_init(void)
    {
        ret_code_t err_code;
        bsp_event_t startup_event;
        err_code = bsp_init(BSP_INIT_LED, bsp_event_handler);
        APP_ERROR_CHECK(err_code);
        err_code = bsp_btn_ble_init(NULL, &startup_event);
        APP_ERROR_CHECK(err_code);
    }
    
    
    /**@brief Function for initializing the nrf log module. */
    static void log_init(void)
    {
        ret_code_t err_code = NRF_LOG_INIT(NULL);
        APP_ERROR_CHECK(err_code);
    
        NRF_LOG_DEFAULT_BACKENDS_INIT();
    }
    
    
    /**@brief Function for initializing the Power manager. */
    static void power_init(void)
    {
        ret_code_t err_code = nrf_pwr_mgmt_init();
        APP_ERROR_CHECK(err_code);
    }
    
    
    /** @brief Function for initializing the Database Discovery Module. */
    static void db_discovery_init(void)
    {
        ret_code_t err_code = ble_db_discovery_init(db_disc_handler);
        APP_ERROR_CHECK(err_code);
    }
    
    
    
    void Sorting()
    {
    	uint8_t i = 0;
    	uint8_t j = 0;
    	Data temp;
    	for(i = 0; i < num; i ++)
    	{
    		for(j = i + 1; j < num; j ++)
    		{
    			if(scanData[i].rssi > scanData[j].rssi)
    			{
    				temp = scanData[i];
    				scanData[i] = scanData[j];
    				scanData[j] = temp;
    			}
    		}
    	}
    }
    
    void printfScan()
    {
    	uint8_t i = 0;
    	while(i < num)
    	{
    		
    //		while((app_uart_getSize()>=160&&app_uart_getSize()<=256));
    		printf("NUM:%d\t",i);
    //		printf("Name:%s\t",scanData[i].name);
    		printf("MAC:%02X%02X%02X%02X%02X%02X\t",
    			scanData[i].mac[5],
    			scanData[i].mac[4],
    			scanData[i].mac[3],
    			scanData[i].mac[2],
    			scanData[i].mac[1],
    			scanData[i].mac[0]
    		);
    		printf("major:%04X minor:%04X ",scanData[i].major,scanData[i].minor);
    		printf("RSSI:-%02d\r\n",scanData[i++].rssi);
    	}
    	num = 0;
    	memset(scanData,0,sizeof(Data)*SCAN_RES_MAX);
    	
    }
    
    /*---------------------------���޸�-------------------------------------*/
    void application1_timers_start(void)  
    {  
        uint32_t err_code;  
        err_code = app_timer_start(m_scan_timer_id1, SCAN_TIMER_INTERVAL1, NULL);  
        APP_ERROR_CHECK(err_code);   
    	
    }
    void application1_timers_stop(void)
    {
    	uint32_t err_code;  
        err_code = app_timer_stop(m_scan_timer_id1);  
        APP_ERROR_CHECK(err_code);  
    }
    void application2_timers_start(void)  
    {  
        uint32_t err_code;  
        err_code = app_timer_start(m_scan_timer_id2, SCAN_TIMER_WINDOW, NULL);  
        APP_ERROR_CHECK(err_code);   
    	isScanning = false;
    }
    void application2_timers_stop(void)
    {
    	uint32_t err_code;  
        err_code = app_timer_stop(m_scan_timer_id2);  
        APP_ERROR_CHECK(err_code);  
    }
    
    
    static void scan_timeout_handler1(void * p_context)
    {
    	sd_ble_gap_scan_stop();
    	Sorting();
    	isScanning = false;
    	application2_timers_start();
    	printfScan();
    }
    static void scan_timeout_handler2(void * p_context)
    {
    	application1_timers_start();
    	scan_start();
    	isScanning = true;
    }
    static void timer_init(void)
    {
        ret_code_t err_code = app_timer_init();
        APP_ERROR_CHECK(err_code);
    	err_code = app_timer_create(&m_scan_timer_id1,
                                    APP_TIMER_MODE_SINGLE_SHOT,
                                    scan_timeout_handler1);
        APP_ERROR_CHECK(err_code);
    	err_code = app_timer_create(&m_scan_timer_id2,
                                    APP_TIMER_MODE_SINGLE_SHOT,
                                    scan_timeout_handler2);
        APP_ERROR_CHECK(err_code);
    }
    /*-----------------------------------------------------------------------*/
    
    
    
    
    
    
    
    int main(void)
    {
    
        log_init();
    	timer_init();
        power_init();
        uart_init();
        buttons_leds_init();
        db_discovery_init();
        ble_stack_init();
    	es_battery_voltage_init();
    	bsp_board_leds_init();
    	
    	printf("------------------------------------------\r\n");
    	
        for (;;)
        {
    		//es_battery_voltage_get();
    //		if(isScanning == false && num != 0)
    //			printfScan();
            if (NRF_LOG_PROCESS() == false)
            {
                nrf_pwr_mgmt_run();
            }
        }
    }
    

Related