<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>when I add uart to ble central multilink,there are all of &amp;quot;</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/38155/when-i-add-uart-to-ble-central-multilink-there-are-all-of</link><description>Hi all: 
 when i add uart code in ble_multilink ,and it gived me errors like this: 
 &amp;quot;&amp;lt;error&amp;gt; app: Fatal error &amp;lt;warning&amp;gt; app: System reset &amp;lt;error&amp;gt; app: Fatal error &amp;lt;warning&amp;gt; app: System reset &amp;lt;error&amp;gt; app: Fatal error &amp;lt;warning&amp;gt; app: System reset &amp;lt;error</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 05 Sep 2018 10:13:17 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/38155/when-i-add-uart-to-ble-central-multilink-there-are-all-of" /><item><title>RE: when I add uart to ble central multilink,there are all of "</title><link>https://devzone.nordicsemi.com/thread/147342?ContentTypeID=1</link><pubDate>Wed, 05 Sep 2018 10:13:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a9d67eec-7a6c-46ec-b410-0623b2090336</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Which toolchain are you using, pure GCC, Segger embedded studio, Keil or IAR? Here is a relevant but a bit dated thread regarding debugging:&amp;nbsp;&lt;a href="https://devzone.nordicsemi.com/f/nordic-q-a/10729/my-device-is-freezing-and-restarting"&gt;https://devzone.nordicsemi.com/f/nordic-q-a/10729/my-device-is-freezing-and-restarting&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: when I add uart to ble central multilink,there are all of "</title><link>https://devzone.nordicsemi.com/thread/147256?ContentTypeID=1</link><pubDate>Wed, 05 Sep 2018 02:18:56 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5b1336a3-c3dd-4534-8eb5-2b37435938f6</guid><dc:creator>ckckckboy</dc:creator><description>&lt;p&gt;&lt;span&gt;Thank you for your reply!&amp;nbsp;when I run in debug mode,it can just goto app_error_weak,i also didn&amp;#39;t know where my code is wrong,i&amp;#39;m a newbee,and i check my code,i also can&amp;#39;t konw where is wrong,Could you send me a debug blog for NRF52 project,and This is my main code:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt; * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA&lt;br /&gt; * &lt;br /&gt; * All rights reserved.&lt;br /&gt; * &lt;br /&gt; * Redistribution and use in source and binary forms, with or without modification,&lt;br /&gt; * are permitted provided that the following conditions are met:&lt;br /&gt; * &lt;br /&gt; * 1. Redistributions of source code must retain the above copyright notice, this&lt;br /&gt; * list of conditions and the following disclaimer.&lt;br /&gt; * &lt;br /&gt; * 2. Redistributions in binary form, except as embedded into a Nordic&lt;br /&gt; * Semiconductor ASA integrated circuit in a product or a software update for&lt;br /&gt; * such product, must reproduce the above copyright notice, this list of&lt;br /&gt; * conditions and the following disclaimer in the documentation and/or other&lt;br /&gt; * materials provided with the distribution.&lt;br /&gt; * &lt;br /&gt; * 3. Neither the name of Nordic Semiconductor ASA nor the names of its&lt;br /&gt; * contributors may be used to endorse or promote products derived from this&lt;br /&gt; * software without specific prior written permission.&lt;br /&gt; * &lt;br /&gt; * 4. This software, with or without modification, must only be used with a&lt;br /&gt; * Nordic Semiconductor ASA integrated circuit.&lt;br /&gt; * &lt;br /&gt; * 5. Any software provided in binary form under this license must not be reverse&lt;br /&gt; * engineered, decompiled, modified and/or disassembled.&lt;br /&gt; * &lt;br /&gt; * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA &amp;quot;AS IS&amp;quot; AND ANY EXPRESS&lt;br /&gt; * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES&lt;br /&gt; * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE&lt;br /&gt; * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE&lt;br /&gt; * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt; * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE&lt;br /&gt; * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)&lt;br /&gt; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&lt;br /&gt; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT&lt;br /&gt; * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;/**&lt;br /&gt; * @brief BLE LED Button Service central and client application main file.&lt;br /&gt; *&lt;br /&gt; * This example can be a central for up to 8 peripherals.&lt;br /&gt; * The peripheral is called ble_app_blinky and can be found in the ble_peripheral&lt;br /&gt; * folder.&lt;br /&gt; */&lt;/p&gt;
&lt;p&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;quot;nordic_common.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_sdh.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_sdh_ble.h&amp;quot;&lt;br /&gt;#include &amp;quot;app_timer.h&amp;quot;&lt;br /&gt;//new added&lt;br /&gt;#include &amp;quot;app_uart.h&amp;quot;&lt;br /&gt;#include &amp;quot;app_util.h&amp;quot;&lt;br /&gt;//end my added&lt;br /&gt;#include &amp;quot;bsp_btn_ble.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble_hci.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble_advdata.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble_advertising.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble_conn_params.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble_db_discovery.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble_lbs_c.h&amp;quot;&lt;br /&gt;#include &amp;quot;ble_conn_state.h&amp;quot;&lt;br /&gt;//my added&lt;br /&gt;#include &amp;quot;ble_nus_c.h&amp;quot;&lt;br /&gt;//end added&lt;br /&gt;#include &amp;quot;nrf_ble_gatt.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_pwr_mgmt.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;nrf_log.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_log_ctrl.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_log_default_backends.h&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;#define APP_BLE_CONN_CFG_TAG 1 /**&amp;lt; A tag that refers to the BLE stack configuration we set with @ref sd_ble_cfg_set. Default tag is @ref APP_BLE_CONN_CFG_TAG. */&lt;br /&gt;#define APP_BLE_OBSERVER_PRIO 3 /**&amp;lt; Application&amp;#39;s BLE observer priority. You shouldn&amp;#39;t need to modify this value. */&lt;/p&gt;
&lt;p&gt;//my added&lt;br /&gt;#define UART_TX_BUF_SIZE 256 /**&amp;lt; UART TX buffer size. */&lt;br /&gt;#define UART_RX_BUF_SIZE 256 /**&amp;lt; UART RX buffer size. */&lt;br /&gt;#define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**&amp;lt; UUID type for the Nordic UART Service (vendor specific). */&lt;br /&gt;//end added&lt;/p&gt;
&lt;p&gt;#define CENTRAL_SCANNING_LED BSP_BOARD_LED_0&lt;br /&gt;#define CENTRAL_CONNECTED_LED BSP_BOARD_LED_1&lt;br /&gt;#define LEDBUTTON_LED BSP_BOARD_LED_2 /**&amp;lt; LED to indicate a change of state of the the Button characteristic on the peer. */&lt;/p&gt;
&lt;p&gt;#define LEDBUTTON_BUTTON BSP_BUTTON_0 /**&amp;lt; Button that will write to the LED characteristic of the peer. */&lt;br /&gt;#define BUTTON_DETECTION_DELAY APP_TIMER_TICKS(50) /**&amp;lt; Delay from a GPIOTE event until a button is reported as pushed (in number of timer ticks). */&lt;/p&gt;
&lt;p&gt;#define SCAN_INTERVAL 0x00A0 /**&amp;lt; Determines scan interval in units of 0.625 millisecond. */&lt;br /&gt;#define SCAN_WINDOW 0x0050 /**&amp;lt; Determines scan window in units of 0.625 millisecond. */&lt;br /&gt;#define SCAN_DURATION 0x0000 /**&amp;lt; Duration of the scanning in units of 10 milliseconds. If set to 0x0000, scanning will continue until it is explicitly disabled. */&lt;/p&gt;
&lt;p&gt;#define MIN_CONNECTION_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS) /**&amp;lt; Determines minimum connection interval in milliseconds. */&lt;br /&gt;#define MAX_CONNECTION_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /**&amp;lt; Determines maximum connection interval in milliseconds. */&lt;br /&gt;#define SLAVE_LATENCY 0 /**&amp;lt; Determines slave latency in terms of connection events. */&lt;br /&gt;#define SUPERVISION_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**&amp;lt; Determines supervision time-out in units of 10 milliseconds. */&lt;/p&gt;
&lt;p&gt;//my added&lt;br /&gt;#define ECHOBACK_BLE_UART_DATA 1 /**&amp;lt; Echo the UART data that is received over the Nordic UART Service back to the sender. */&lt;br /&gt;BLE_NUS_C_DEF(m_ble_nus_c); /**&amp;lt; BLE NUS service client instance. */&lt;br /&gt;//end added&lt;br /&gt;NRF_BLE_GATT_DEF(m_gatt); /**&amp;lt; GATT module instance. */&lt;br /&gt;BLE_LBS_C_ARRAY_DEF(m_lbs_c, NRF_SDH_BLE_CENTRAL_LINK_COUNT); /**&amp;lt; LED Button client instances. */&lt;br /&gt;BLE_DB_DISCOVERY_ARRAY_DEF(m_db_disc, NRF_SDH_BLE_CENTRAL_LINK_COUNT); /**&amp;lt; Database discovery module instances. */&lt;/p&gt;
&lt;p&gt;static char const m_target_periph_name[] = &amp;quot;Pig_T&amp;quot;; /**&amp;lt; Name of the device we try to connect to. This name is searched for in the scan report data*/&lt;/p&gt;
&lt;p&gt;static uint8_t m_scan_buffer_data[BLE_GAP_SCAN_BUFFER_MIN]; /**&amp;lt; buffer where advertising reports will be stored by the SoftDevice. */&lt;br /&gt;//my added&lt;br /&gt;static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - OPCODE_LENGTH - HANDLE_LENGTH; /**&amp;lt; Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */&lt;br /&gt;//end added&lt;br /&gt;/**@brief Pointer to the buffer where advertising reports will be stored by the SoftDevice. */&lt;br /&gt;static ble_data_t m_scan_buffer =&lt;br /&gt;{&lt;br /&gt; m_scan_buffer_data,&lt;br /&gt; BLE_GAP_SCAN_BUFFER_MIN&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;/**@brief Scan parameters requested for scanning and connection. */&lt;br /&gt;static ble_gap_scan_params_t const m_scan_params =&lt;br /&gt;{&lt;br /&gt; .active = 0,&lt;br /&gt; .interval = SCAN_INTERVAL,&lt;br /&gt; .window = SCAN_WINDOW,&lt;/p&gt;
&lt;p&gt;.timeout = SCAN_DURATION,&lt;br /&gt; .scan_phys = BLE_GAP_PHY_1MBPS,&lt;br /&gt; .filter_policy = BLE_GAP_SCAN_FP_ACCEPT_ALL,&lt;/p&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;/**@brief Connection parameters requested for connection. */&lt;br /&gt;static ble_gap_conn_params_t const m_connection_param =&lt;br /&gt;{&lt;br /&gt; (uint16_t)MIN_CONNECTION_INTERVAL,&lt;br /&gt; (uint16_t)MAX_CONNECTION_INTERVAL,&lt;br /&gt; (uint16_t)SLAVE_LATENCY,&lt;br /&gt; (uint16_t)SUPERVISION_TIMEOUT&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function to handle asserts in the SoftDevice.&lt;br /&gt; *&lt;br /&gt; * @details This function will be called in case of an assert in the SoftDevice.&lt;br /&gt; *&lt;br /&gt; * @warning This handler is an example only and does not fit a final product. You need to analyze&lt;br /&gt; * how your product is supposed to react in case of Assert.&lt;br /&gt; * @warning On assert from the SoftDevice, the system can only recover on reset.&lt;br /&gt; *&lt;br /&gt; * @param[in] line_num Line number of the failing ASSERT call.&lt;br /&gt; * @param[in] p_file_name File name of the failing ASSERT call.&lt;br /&gt; */&lt;br /&gt;void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)&lt;br /&gt;{&lt;br /&gt; app_error_handler(0xDEADBEEF, line_num, p_file_name);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for the LEDs initialization.&lt;br /&gt; *&lt;br /&gt; * @details Initializes all LEDs used by the application.&lt;br /&gt; */&lt;br /&gt;static void leds_init(void)&lt;br /&gt;{&lt;br /&gt; bsp_board_init(BSP_INIT_LEDS);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function to start scanning. */&lt;br /&gt;static void scan_start(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t ret;&lt;/p&gt;
&lt;p&gt;(void) sd_ble_gap_scan_stop();&lt;/p&gt;
&lt;p&gt;NRF_LOG_INFO(&amp;quot;Start scanning for device name %s.&amp;quot;, (uint32_t)m_target_periph_name);&lt;br /&gt; ret = sd_ble_gap_scan_start(&amp;amp;m_scan_params, &amp;amp;m_scan_buffer);&lt;br /&gt; APP_ERROR_CHECK(ret);&lt;br /&gt; // Turn on the LED to signal scanning.&lt;br /&gt; bsp_board_led_on(CENTRAL_SCANNING_LED);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Handles events coming from the LED Button central module.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_lbs_c The instance of LBS_C that triggered the event.&lt;br /&gt; * @param[in] p_lbs_c_evt The LBS_C event.&lt;br /&gt; */&lt;br /&gt;static void lbs_c_evt_handler(ble_lbs_c_t * p_lbs_c, ble_lbs_c_evt_t * p_lbs_c_evt)&lt;br /&gt;{&lt;br /&gt; switch (p_lbs_c_evt-&amp;gt;evt_type)&lt;br /&gt; {&lt;br /&gt; case BLE_LBS_C_EVT_DISCOVERY_COMPLETE:&lt;br /&gt; {&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;NRF_LOG_INFO(&amp;quot;LED Button service discovered on conn_handle 0x%x&amp;quot;,&lt;br /&gt; p_lbs_c_evt-&amp;gt;conn_handle);&lt;/p&gt;
&lt;p&gt;err_code = app_button_enable();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// LED Button service discovered. Enable notification of Button.&lt;br /&gt; err_code = ble_lbs_c_button_notif_enable(p_lbs_c);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; } break; // BLE_LBS_C_EVT_DISCOVERY_COMPLETE&lt;/p&gt;
&lt;p&gt;case BLE_LBS_C_EVT_BUTTON_NOTIFICATION:&lt;br /&gt; {&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Link 0x%x, Button state changed on peer to 0x%x&amp;quot;,&lt;br /&gt; p_lbs_c_evt-&amp;gt;conn_handle,&lt;br /&gt; p_lbs_c_evt-&amp;gt;params.button.button_state);&lt;/p&gt;
&lt;p&gt;if (p_lbs_c_evt-&amp;gt;params.button.button_state)&lt;br /&gt; {&lt;br /&gt; bsp_board_led_on(LEDBUTTON_LED);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt; bsp_board_led_off(LEDBUTTON_LED);&lt;br /&gt; }&lt;br /&gt; } break; // BLE_LBS_C_EVT_BUTTON_NOTIFICATION&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; // No implementation needed.&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling the advertising report BLE event.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_adv_report Advertising report from the SoftDevice.&lt;br /&gt; */&lt;br /&gt;static void on_adv_report(ble_gap_evt_adv_report_t const * p_adv_report)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;if (ble_advdata_name_find(p_adv_report-&amp;gt;data.p_data,&lt;br /&gt; p_adv_report-&amp;gt;data.len,&lt;br /&gt; m_target_periph_name))&lt;br /&gt; {&lt;br /&gt; // Name is a match, initiate connection.&lt;br /&gt; err_code = sd_ble_gap_connect(&amp;amp;p_adv_report-&amp;gt;peer_addr,&lt;br /&gt; &amp;amp;m_scan_params,&lt;br /&gt; &amp;amp;m_connection_param, &lt;br /&gt; APP_BLE_CONN_CFG_TAG);&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connection Start&amp;quot;);&lt;br /&gt; for(int i=0;i&amp;lt;33;i++){&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connection data i %d&amp;quot;,p_adv_report-&amp;gt;data.p_data[i]);&lt;br /&gt; //NRF_LOG_INFO(&amp;quot;Connection char i %s&amp;quot;,p_adv_report-&amp;gt;data.p_data[i]);&lt;br /&gt; //NRF_LOG_INFO(&amp;quot;Connection hex i %x&amp;quot;,p_adv_report-&amp;gt;data.p_data[i]);&lt;br /&gt; }&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connection end&amp;quot;);&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connection data %d,%d&amp;quot;,p_adv_report-&amp;gt;data.p_data,p_adv_report-&amp;gt;data.len);&lt;br /&gt; if (err_code != NRF_SUCCESS)&lt;br /&gt; {&lt;br /&gt; NRF_LOG_ERROR(&amp;quot;Connection Request Failed, reason %d&amp;quot;, err_code);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt; err_code = sd_ble_gap_scan_start(NULL, &amp;amp;m_scan_buffer);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling BLE events.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_ble_evt Bluetooth stack event.&lt;br /&gt; * @param[in] p_context Unused.&lt;br /&gt; */&lt;br /&gt;static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;// For readability.&lt;br /&gt; ble_gap_evt_t const * p_gap_evt = &amp;amp;p_ble_evt-&amp;gt;evt.gap_evt;&lt;/p&gt;
&lt;p&gt;switch (p_ble_evt-&amp;gt;header.evt_id)&lt;br /&gt; {&lt;br /&gt; // Upon connection, check which peripheral has connected, initiate DB&lt;br /&gt; // discovery, update LEDs status and resume scanning if necessary.&lt;br /&gt; case BLE_GAP_EVT_CONNECTED:&lt;br /&gt; {&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connection 0x%x established, starting DB discovery.&amp;quot;,&lt;br /&gt; p_gap_evt-&amp;gt;conn_handle);&lt;/p&gt;
&lt;p&gt;APP_ERROR_CHECK_BOOL(p_gap_evt-&amp;gt;conn_handle &amp;lt; NRF_SDH_BLE_CENTRAL_LINK_COUNT);&lt;br /&gt; err_code = ble_nus_c_handles_assign(&amp;amp;m_ble_nus_c, p_ble_evt-&amp;gt;evt.gap_evt.conn_handle, NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; err_code = ble_lbs_c_handles_assign(&amp;amp;m_lbs_c[p_gap_evt-&amp;gt;conn_handle],&lt;br /&gt; p_gap_evt-&amp;gt;conn_handle,&lt;br /&gt; NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;err_code = ble_db_discovery_start(&amp;amp;m_db_disc[p_gap_evt-&amp;gt;conn_handle],&lt;br /&gt; p_gap_evt-&amp;gt;conn_handle);&lt;br /&gt; if (err_code != NRF_ERROR_BUSY)&lt;br /&gt; {&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;// Update LEDs status, and check if we should be looking for more&lt;br /&gt; // peripherals to connect to.&lt;br /&gt; bsp_board_led_on(CENTRAL_CONNECTED_LED);&lt;br /&gt; if (ble_conn_state_central_conn_count() == NRF_SDH_BLE_CENTRAL_LINK_COUNT)&lt;br /&gt; {&lt;br /&gt; bsp_board_led_off(CENTRAL_SCANNING_LED);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt; // Resume scanning.&lt;br /&gt; bsp_board_led_on(CENTRAL_SCANNING_LED);&lt;br /&gt; scan_start();&lt;br /&gt; }&lt;br /&gt; } break; // BLE_GAP_EVT_CONNECTED&lt;/p&gt;
&lt;p&gt;// Upon disconnection, reset the connection handle of the peer which disconnected, update&lt;br /&gt; // the LEDs status and start scanning again.&lt;br /&gt; case BLE_GAP_EVT_DISCONNECTED:&lt;br /&gt; {&lt;br /&gt; NRF_LOG_INFO(&amp;quot;LBS central link 0x%x disconnected (reason: 0x%x)&amp;quot;,&lt;br /&gt; p_gap_evt-&amp;gt;conn_handle,&lt;br /&gt; p_gap_evt-&amp;gt;params.disconnected.reason);&lt;/p&gt;
&lt;p&gt;if (ble_conn_state_central_conn_count() == 0)&lt;br /&gt; {&lt;br /&gt; err_code = app_button_disable();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Turn off connection indication LED&lt;br /&gt; bsp_board_led_off(CENTRAL_CONNECTED_LED);&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;// Start scanning&lt;br /&gt; scan_start();&lt;/p&gt;
&lt;p&gt;// Turn on LED for indicating scanning&lt;br /&gt; bsp_board_led_on(CENTRAL_SCANNING_LED);&lt;/p&gt;
&lt;p&gt;} break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_ADV_REPORT:&lt;br /&gt; on_adv_report(&amp;amp;p_gap_evt-&amp;gt;params.adv_report);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_TIMEOUT:&lt;br /&gt; {&lt;br /&gt; // We have not specified a timeout for scanning, so only connection attemps can timeout.&lt;br /&gt; if (p_gap_evt-&amp;gt;params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)&lt;br /&gt; {&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;Connection request timed out.&amp;quot;);&lt;br /&gt; }&lt;br /&gt; } break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:&lt;br /&gt; {&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST.&amp;quot;);&lt;br /&gt; // Accept parameters requested by peer.&lt;br /&gt; err_code = sd_ble_gap_conn_param_update(p_gap_evt-&amp;gt;conn_handle,&lt;br /&gt; &amp;amp;p_gap_evt-&amp;gt;params.conn_param_update_request.conn_params);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; } break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_PHY_UPDATE_REQUEST:&lt;br /&gt; {&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;PHY update request.&amp;quot;);&lt;br /&gt; ble_gap_phys_t const phys =&lt;br /&gt; {&lt;br /&gt; .rx_phys = BLE_GAP_PHY_AUTO,&lt;br /&gt; .tx_phys = BLE_GAP_PHY_AUTO,&lt;br /&gt; };&lt;br /&gt; err_code = sd_ble_gap_phy_update(p_ble_evt-&amp;gt;evt.gap_evt.conn_handle, &amp;amp;phys);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; } break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTC_EVT_TIMEOUT:&lt;br /&gt; {&lt;br /&gt; // Disconnect on GATT Client timeout event.&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;GATT Client Timeout.&amp;quot;);&lt;br /&gt; err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gattc_evt.conn_handle,&lt;br /&gt; BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; } break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTS_EVT_TIMEOUT:&lt;br /&gt; {&lt;br /&gt; // Disconnect on GATT Server timeout event.&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;GATT Server Timeout.&amp;quot;);&lt;br /&gt; err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gatts_evt.conn_handle,&lt;br /&gt; BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; } break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; // No implementation needed.&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief LED Button collector initialization. */&lt;br /&gt;static void lbs_c_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;br /&gt; ble_lbs_c_init_t lbs_c_init_obj;&lt;/p&gt;
&lt;p&gt;lbs_c_init_obj.evt_handler = lbs_c_evt_handler;&lt;/p&gt;
&lt;p&gt;for (uint32_t i = 0; i &amp;lt; NRF_SDH_BLE_CENTRAL_LINK_COUNT; i++)&lt;br /&gt; {&lt;br /&gt; err_code = ble_lbs_c_init(&amp;amp;m_lbs_c[i], &amp;amp;lbs_c_init_obj);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the BLE stack.&lt;br /&gt; *&lt;br /&gt; * @details Initializes the SoftDevice and the BLE event interrupts.&lt;br /&gt; */&lt;br /&gt;static void ble_stack_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = nrf_sdh_enable_request();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Configure the BLE stack using the default settings.&lt;br /&gt; // Fetch the start address of the application RAM.&lt;br /&gt; uint32_t ram_start = 0;&lt;br /&gt; err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Enable BLE stack.&lt;br /&gt; err_code = nrf_sdh_ble_enable(&amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Register a handler for BLE events.&lt;br /&gt; NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for writing to the LED characteristic of all connected clients.&lt;br /&gt; *&lt;br /&gt; * @details Based on if the button is pressed or released, this function writes a high or low&lt;br /&gt; * LED status to the server.&lt;br /&gt; *&lt;br /&gt; * @param[in] button_action The button action (press/release).&lt;br /&gt; * Determines if the LEDs of the servers will be ON or OFF.&lt;br /&gt; *&lt;br /&gt; * @return If successful NRF_SUCCESS is returned. Otherwise, the error code from @ref ble_lbs_led_status_send.&lt;br /&gt; */&lt;br /&gt;static ret_code_t led_status_send_to_all(uint8_t button_action)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;for (uint32_t i = 0; i&amp;lt; NRF_SDH_BLE_CENTRAL_LINK_COUNT; i++)&lt;br /&gt; {&lt;br /&gt; err_code = ble_lbs_led_status_send(&amp;amp;m_lbs_c[i], button_action);&lt;br /&gt; if (err_code != NRF_SUCCESS &amp;amp;&amp;amp;&lt;br /&gt; err_code != BLE_ERROR_INVALID_CONN_HANDLE &amp;amp;&amp;amp;&lt;br /&gt; err_code != NRF_ERROR_INVALID_STATE)&lt;br /&gt; {&lt;br /&gt; return err_code;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling events from the button handler module.&lt;br /&gt; *&lt;br /&gt; * @param[in] pin_no The pin that the event applies to.&lt;br /&gt; * @param[in] button_action The button action (press/release).&lt;br /&gt; */&lt;br /&gt;static void button_event_handler(uint8_t pin_no, uint8_t button_action)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;switch (pin_no)&lt;br /&gt; {&lt;br /&gt; case LEDBUTTON_BUTTON:&lt;br /&gt; err_code = led_status_send_to_all(button_action);&lt;br /&gt; if (err_code == NRF_SUCCESS)&lt;br /&gt; {&lt;br /&gt; NRF_LOG_INFO(&amp;quot;LBS write LED state %d&amp;quot;, button_action);&lt;br /&gt; }&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; APP_ERROR_HANDLER(pin_no);&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the button handler module.&lt;br /&gt; */&lt;br /&gt;static void buttons_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;// The array must be static because a pointer to it will be saved in the button handler module.&lt;br /&gt; static app_button_cfg_t buttons[] =&lt;br /&gt; {&lt;br /&gt; {LEDBUTTON_BUTTON, false, BUTTON_PULL, button_event_handler}&lt;br /&gt; };&lt;/p&gt;
&lt;p&gt;err_code = app_button_init(buttons, ARRAY_SIZE(buttons), BUTTON_DETECTION_DELAY);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling database discovery events.&lt;br /&gt; *&lt;br /&gt; * @details This function is callback function to handle events from the database discovery module.&lt;br /&gt; * Depending on the UUIDs that are discovered, this function should forward the events&lt;br /&gt; * to their respective services.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_event Pointer to the database discovery event.&lt;br /&gt; */&lt;br /&gt;static void db_disc_handler(ble_db_discovery_evt_t * p_evt)&lt;br /&gt;{&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;call to ble_lbs_on_db_disc_evt for instance %d and link 0x%x!&amp;quot;,&lt;br /&gt; p_evt-&amp;gt;conn_handle,&lt;br /&gt; p_evt-&amp;gt;conn_handle);&lt;/p&gt;
&lt;p&gt;ble_lbs_on_db_disc_evt(&amp;amp;m_lbs_c[p_evt-&amp;gt;conn_handle], p_evt);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//my added&lt;br /&gt;/**@brief Function for handling characters received by the Nordic UART Service.&lt;br /&gt; *&lt;br /&gt; * @details This function takes a list of characters of length data_len and prints the characters out on UART.&lt;br /&gt; * If @ref ECHOBACK_BLE_UART_DATA is set, the data is sent back to sender.&lt;br /&gt; */&lt;br /&gt;static void ble_nus_chars_received_uart_print(uint8_t * p_data, uint16_t data_len)&lt;br /&gt;{&lt;br /&gt; ret_code_t ret_val;&lt;/p&gt;
&lt;p&gt;NRF_LOG_DEBUG(&amp;quot;Receiving data.&amp;quot;);&lt;br /&gt; NRF_LOG_HEXDUMP_DEBUG(p_data, data_len);&lt;/p&gt;
&lt;p&gt;for (uint32_t i = 0; i &amp;lt; data_len; i++)&lt;br /&gt; {&lt;br /&gt; do&lt;br /&gt; {&lt;br /&gt; ret_val = app_uart_put(p_data[i]);&lt;br /&gt; if ((ret_val != NRF_SUCCESS) &amp;amp;&amp;amp; (ret_val != NRF_ERROR_BUSY))&lt;br /&gt; {&lt;br /&gt; NRF_LOG_ERROR(&amp;quot;app_uart_put failed for index 0x%04x.&amp;quot;, i);&lt;br /&gt; APP_ERROR_CHECK(ret_val);&lt;br /&gt; }&lt;br /&gt; } while (ret_val == NRF_ERROR_BUSY);&lt;br /&gt; }&lt;br /&gt; if (p_data[data_len-1] == &amp;#39;\r&amp;#39;)&lt;br /&gt; {&lt;br /&gt; while (app_uart_put(&amp;#39;\n&amp;#39;) == NRF_ERROR_BUSY);&lt;br /&gt; }&lt;br /&gt; if (ECHOBACK_BLE_UART_DATA)&lt;br /&gt; {&lt;br /&gt; // Send data back to peripheral.&lt;br /&gt; do&lt;br /&gt; {&lt;br /&gt; ret_val = ble_nus_c_string_send(&amp;amp;m_ble_nus_c, p_data, data_len);&lt;br /&gt; if ((ret_val != NRF_SUCCESS) &amp;amp;&amp;amp; (ret_val != NRF_ERROR_BUSY))&lt;br /&gt; {&lt;br /&gt; NRF_LOG_ERROR(&amp;quot;Failed sending NUS message. Error 0x%x. &amp;quot;, ret_val);&lt;br /&gt; APP_ERROR_CHECK(ret_val);&lt;br /&gt; }&lt;br /&gt; } while (ret_val == NRF_ERROR_BUSY);&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling app_uart events.&lt;br /&gt; *&lt;br /&gt; * @details This function will receive a single character from the app_uart module and append it to&lt;br /&gt; * a string. The string will be be sent over BLE when the last character received was a&lt;br /&gt; * &amp;#39;new line&amp;#39; &amp;#39;\n&amp;#39; (hex 0x0A) or if the string has reached the maximum data length.&lt;br /&gt; */&lt;br /&gt;void uart_event_handle(app_uart_evt_t * p_event)&lt;br /&gt;{&lt;br /&gt; static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];&lt;br /&gt; static uint16_t index = 0;&lt;br /&gt; uint32_t ret_val;&lt;/p&gt;
&lt;p&gt;switch (p_event-&amp;gt;evt_type)&lt;br /&gt; {&lt;br /&gt; /**@snippet [Handling data from UART] */&lt;br /&gt; case APP_UART_DATA_READY:&lt;br /&gt; UNUSED_VARIABLE(app_uart_get(&amp;amp;data_array[index]));&lt;br /&gt; index++;&lt;/p&gt;
&lt;p&gt;if ((data_array[index - 1] == &amp;#39;\n&amp;#39;) || (index &amp;gt;= (m_ble_nus_max_data_len)))&lt;br /&gt; {&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;Ready to send data over BLE NUS&amp;quot;);&lt;br /&gt; NRF_LOG_HEXDUMP_DEBUG(data_array, index);&lt;/p&gt;
&lt;p&gt;do&lt;br /&gt; {&lt;br /&gt; ret_val = ble_nus_c_string_send(&amp;amp;m_ble_nus_c, data_array, index);&lt;br /&gt; if ( (ret_val != NRF_ERROR_INVALID_STATE) &amp;amp;&amp;amp; (ret_val != NRF_ERROR_BUSY) )&lt;br /&gt; {&lt;br /&gt; APP_ERROR_CHECK(ret_val);&lt;br /&gt; }&lt;br /&gt; } while (ret_val == NRF_ERROR_BUSY);&lt;/p&gt;
&lt;p&gt;index = 0;&lt;br /&gt; }&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;/**@snippet [Handling data from UART] */&lt;br /&gt; case APP_UART_COMMUNICATION_ERROR:&lt;br /&gt; NRF_LOG_ERROR(&amp;quot;Communication error occurred while handling UART.&amp;quot;);&lt;br /&gt; APP_ERROR_HANDLER(p_event-&amp;gt;data.error_communication);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case APP_UART_FIFO_ERROR:&lt;br /&gt; NRF_LOG_ERROR(&amp;quot;Error occurred in FIFO module used by UART.&amp;quot;);&lt;br /&gt; APP_ERROR_HANDLER(p_event-&amp;gt;data.error_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Callback handling NUS Client events.&lt;br /&gt; *&lt;br /&gt; * @details This function is called to notify the application of NUS client events.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_ble_nus_c NUS Client Handle. This identifies the NUS client&lt;br /&gt; * @param[in] p_ble_nus_evt Pointer to the NUS Client event.&lt;br /&gt; */&lt;/p&gt;
&lt;p&gt;/**@snippet [Handling events from the ble_nus_c module] */&lt;br /&gt;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)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;switch (p_ble_nus_evt-&amp;gt;evt_type)&lt;br /&gt; {&lt;br /&gt; case BLE_NUS_C_EVT_DISCOVERY_COMPLETE:&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Discovery complete.&amp;quot;);&lt;br /&gt; err_code = ble_nus_c_handles_assign(p_ble_nus_c, p_ble_nus_evt-&amp;gt;conn_handle, &amp;amp;p_ble_nus_evt-&amp;gt;handles);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;err_code = ble_nus_c_tx_notif_enable(p_ble_nus_c);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connected to device with Nordic UART Service.&amp;quot;);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_NUS_C_EVT_NUS_TX_EVT:&lt;br /&gt; ble_nus_chars_received_uart_print(p_ble_nus_evt-&amp;gt;p_data, p_ble_nus_evt-&amp;gt;data_len);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_NUS_C_EVT_DISCONNECTED:&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Disconnected.&amp;quot;);&lt;br /&gt; scan_start();&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;/**@snippet [Handling events from the ble_nus_c module] */&lt;br /&gt;/**&lt;br /&gt; * @brief Function for shutdown events.&lt;br /&gt; *&lt;br /&gt; * @param[in] event Shutdown type.&lt;br /&gt; */&lt;br /&gt;static bool shutdown_handler(nrf_pwr_mgmt_evt_t event)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = bsp_indication_set(BSP_INDICATE_IDLE);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;switch (event)&lt;br /&gt; {&lt;br /&gt; case NRF_PWR_MGMT_EVT_PREPARE_WAKEUP:&lt;br /&gt; // Prepare wakeup buttons.&lt;br /&gt; err_code = bsp_btn_ble_sleep_mode_prepare();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; break;&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;return true;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;NRF_PWR_MGMT_HANDLER_REGISTER(shutdown_handler, APP_SHUTDOWN_HANDLER_PRIORITY);&lt;br /&gt;//end added&lt;br /&gt;/** @brief Database discovery initialization.&lt;br /&gt; */&lt;br /&gt;static void db_discovery_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code = ble_db_discovery_init(db_disc_handler);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing power management.&lt;br /&gt; */&lt;br /&gt;static void power_management_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;br /&gt; err_code = nrf_pwr_mgmt_init();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;//my added&lt;br /&gt;/**@brief Function for initializing the UART. */&lt;br /&gt;static void uart_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;app_uart_comm_params_t const comm_params =&lt;br /&gt; {&lt;br /&gt; .rx_pin_no = RX_PIN_NUMBER,&lt;br /&gt; .tx_pin_no = TX_PIN_NUMBER,&lt;br /&gt; .rts_pin_no = RTS_PIN_NUMBER,&lt;br /&gt; .cts_pin_no = CTS_PIN_NUMBER,&lt;br /&gt; .flow_control = APP_UART_FLOW_CONTROL_DISABLED,&lt;br /&gt; .use_parity = false,&lt;br /&gt; .baud_rate = UART_BAUDRATE_BAUDRATE_Baud115200&lt;br /&gt; };&lt;/p&gt;
&lt;p&gt;APP_UART_FIFO_INIT(&amp;amp;comm_params,&lt;br /&gt; UART_RX_BUF_SIZE,&lt;br /&gt; UART_TX_BUF_SIZE,&lt;br /&gt; uart_event_handle,&lt;br /&gt; APP_IRQ_PRIORITY_LOWEST,&lt;br /&gt; err_code);&lt;br /&gt; printf(&amp;quot;err_uart_code%s&amp;quot;,err_code);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**@brief Function for initializing the NUS Client. */&lt;br /&gt;static void nus_c_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;br /&gt; ble_nus_c_init_t init;&lt;/p&gt;
&lt;p&gt;init.evt_handler = ble_nus_c_evt_handler;&lt;/p&gt;
&lt;p&gt;err_code = ble_nus_c_init(&amp;amp;m_ble_nus_c, &amp;amp;init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;//end added&lt;br /&gt;/**@brief Function for handling the idle state (main loop).&lt;br /&gt; *&lt;br /&gt; * @details Handle any pending log operation(s), then sleep until the next event occurs.&lt;br /&gt; */&lt;br /&gt;static void idle_state_handle(void)&lt;br /&gt;{&lt;br /&gt; if (NRF_LOG_PROCESS() == false)&lt;br /&gt; {&lt;br /&gt; nrf_pwr_mgmt_run();&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/** @brief Function for initializing the log module.&lt;br /&gt; */&lt;br /&gt;static void log_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code = NRF_LOG_INIT(NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;NRF_LOG_DEFAULT_BACKENDS_INIT();&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/** @brief Function for initializing the timer.&lt;br /&gt; */&lt;br /&gt;static void timer_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code = app_timer_init();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the GATT module.&lt;br /&gt; */&lt;br /&gt;static void gatt_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code = nrf_ble_gatt_init(&amp;amp;m_gatt, NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt; // Initialize.&lt;br /&gt; log_init();&lt;br /&gt; timer_init();&lt;br /&gt; //my added&lt;br /&gt; uart_init();&lt;br /&gt; //end added&lt;br /&gt; leds_init();&lt;br /&gt; buttons_init();&lt;br /&gt; power_management_init();&lt;br /&gt; ble_stack_init();&lt;br /&gt; gatt_init();&lt;br /&gt; //my added&lt;br /&gt; nus_c_init();&lt;br /&gt; //end added&lt;br /&gt; db_discovery_init();&lt;br /&gt; lbs_c_init();&lt;br /&gt; ble_conn_state_init();&lt;br /&gt; // Start execution.&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Multilink example started.&amp;quot;);&lt;br /&gt; scan_start();&lt;/p&gt;
&lt;p&gt;for (;;)&lt;br /&gt; {&lt;br /&gt; idle_state_handle();&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: when I add uart to ble central multilink,there are all of "</title><link>https://devzone.nordicsemi.com/thread/147156?ContentTypeID=1</link><pubDate>Tue, 04 Sep 2018 11:12:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:66278b71-124e-499f-8d13-d581bbd7c0b7</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;If you compile your project with DEBUG defined you will get the file name, line number, and error code of where the error occurred (&lt;a href="http://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v15.1.0/lib_error.html?cp=4_0_0_3_13"&gt;error module&lt;/a&gt;). Please try re-compile your project with this flag set and check what the error code is and which function call it was returned from.&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>