Nordic SDK printing to serial

匿名 (未验证) 提交于 2019-12-03 01:45:01

问题:

I have an Arduino device that runs on the Nordic SDK (it's a Red Bear Lab BLE nano). I want to be able to do a serial print into GTKTerm to be able to debug what is going on in my code. To do this I have the following code:

/*  * Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.  *  * The information contained herein is confidential property of Nordic Semiconductor. The use,  * copying, transfer or disclosure of such information is prohibited except by express written  * agreement with Nordic Semiconductor.  *  */  /**   * @brief BLE Heart Rate Collector application main file.  *  * This file contains the source code for a sample heart rate collector.  */  #include <stdint.h> #include <stdio.h> #include <string.h> #include "nordic_common.h" #include "nrf_sdm.h" #include "ble.h" #include "ble_hci.h" #include "ble_db_discovery.h" #include "softdevice_handler.h" #include "app_util.h" #include "app_error.h" #include "boards.h" #include "nrf_gpio.h" #include "pstorage.h" #include "device_manager.h" #include "app_trace.h" #include "ble_hrs_c.h" #include "ble_bas_c.h" #include "app_util.h" #include "app_timer.h" #include "bsp.h" #include "bsp_btn_ble.h"  #define UART_TX_BUF_SIZE           256                                /**< UART TX buffer size. */ #define UART_RX_BUF_SIZE           1                                  /**< UART RX buffer size. */  #define STRING_BUFFER_LEN          50 #define BOND_DELETE_ALL_BUTTON_ID  0                                  /**< Button used for deleting all bonded centrals during startup. */  #define APP_TIMER_PRESCALER        0                                  /**< Value of the RTC1 PRESCALER register. */ #define APP_TIMER_MAX_TIMERS       (2+BSP_APP_TIMERS_NUMBER)          /**< Maximum number of simultaneously created timers. */ #define APP_TIMER_OP_QUEUE_SIZE    2                                  /**< Size of timer operation queues. */  #define APPL_LOG                   app_trace_log                      /**< Debug logger macro that will be used in this file to do logging of debug information over UART. */  #define SEC_PARAM_BOND             1                                  /**< Perform bonding. */ #define SEC_PARAM_MITM             1                                  /**< Man In The Middle protection not required. */ #define SEC_PARAM_IO_CAPABILITIES  BLE_GAP_IO_CAPS_NONE               /**< No I/O capabilities. */ #define SEC_PARAM_OOB              0                                  /**< Out Of Band data not available. */ #define SEC_PARAM_MIN_KEY_SIZE     7                                  /**< Minimum encryption key size. */ #define SEC_PARAM_MAX_KEY_SIZE     16                                 /**< Maximum encryption key size. */  #define SCAN_INTERVAL              0x00A0                             /**< Determines scan interval in units of 0.625 millisecond. */ #define SCAN_WINDOW                0x0050                             /**< Determines scan window in units of 0.625 millisecond. */  #define MIN_CONNECTION_INTERVAL    MSEC_TO_UNITS(7.5, UNIT_1_25_MS)   /**< Determines minimum connection interval in millisecond. */ #define MAX_CONNECTION_INTERVAL    MSEC_TO_UNITS(30, 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 TARGET_UUID                0x180D                             /**< Target device name that application is looking for. */ #define MAX_PEER_COUNT             DEVICE_MANAGER_MAX_CONNECTIONS     /**< Maximum number of peer's application intends to manage. */ #define UUID16_SIZE                2                                  /**< Size of 16 bit UUID */  /**@breif Macro to unpack 16bit unsigned UUID from octet stream. */ #define UUID16_EXTRACT(DST, SRC) \     do                           \     {                            \         (*(DST))   = (SRC)[1];   \         (*(DST)) <<= 8;          \         (*(DST))  |= (SRC)[0];   \     } while (0)  /**@brief Variable length data encapsulation in terms of length and pointer to data */ typedef struct {     uint8_t     * p_data;                                             /**< Pointer to data. */     uint16_t      data_len;                                           /**< Length of data. */ }data_t;  typedef enum {     BLE_NO_SCAN,                                                     /**< No advertising running. */     BLE_WHITELIST_SCAN,                                              /**< Advertising with whitelist. */     BLE_FAST_SCAN,                                                   /**< Fast advertising running. */ } ble_scan_mode_t;  static ble_db_discovery_t           m_ble_db_discovery;                  /**< Structure used to identify the DB Discovery module. */ static ble_hrs_c_t                  m_ble_hrs_c;                         /**< Structure used to identify the heart rate client module. */ static ble_bas_c_t                  m_ble_bas_c;                         /**< Structure used to identify the Battery Service client module. */ static ble_gap_scan_params_t        m_scan_param;                        /**< Scan parameters requested for scanning and connection. */ static dm_application_instance_t    m_dm_app_id;                         /**< Application identifier. */ static dm_handle_t                  m_dm_device_handle;                  /**< Device Identifier identifier. */ static uint8_t                      m_peer_count = 0;                    /**< Number of peer's connected. */ static ble_scan_mode_t              m_scan_mode = BLE_FAST_SCAN;         /**< Scan mode used by application. */ static uint16_t                     m_conn_handle;                       /**< Current connection handle. */ static volatile bool                m_whitelist_temporarily_disabled = false; /**< True if whitelist has been temporarily disabled. */  static bool                         m_memory_access_in_progress = false; /**< Flag to keep track of ongoing operations on persistent memory. */  /**  * @brief Connection parameters requested for connection.  */ static const ble_gap_conn_params_t m_connection_param = {     (uint16_t)MIN_CONNECTION_INTERVAL,   // Minimum connection     (uint16_t)MAX_CONNECTION_INTERVAL,   // Maximum connection     0,                                   // Slave latency     (uint16_t)SUPERVISION_TIMEOUT        // Supervision time-out };  static void scan_start(void);  #define APPL_LOG                        app_trace_log             /**< Debug logger macro that will be used in this file to do logging of debug information over UART. */   /**@brief Function for initializing the UART.  */ static void uart_init(void) {     uint32_t err_code;      const app_uart_comm_params_t comm_params =        {            RX_PIN_NUMBER,            TX_PIN_NUMBER,            RTS_PIN_NUMBER,            CTS_PIN_NUMBER,            APP_UART_FLOW_CONTROL_ENABLED,            false,            UART_BAUDRATE_BAUDRATE_Baud38400        };      APP_UART_FIFO_INIT(&comm_params,                           UART_RX_BUF_SIZE,                           UART_TX_BUF_SIZE,                           uart_error_handle,                           APP_IRQ_PRIORITY_LOW,                           err_code);      APP_ERROR_CHECK(err_code);      app_trace_init(); }  /** @brief Function for the Power manager.  */ static void power_manage(void) {     uint32_t err_code = sd_app_evt_wait();      APP_ERROR_CHECK(err_code); }   int main(void) {     bool erase_bonds;      // Initialize.     uart_init();     printf("Heart rate collector example (this is a custom log)\r\n");      for (;; )     {         power_manage();     } } 

The problem I am having is that only sometimes I will see an output in GTKterm. I am unable to find a pattern for when it works and when it doesn't. How would I go about debugging this?

回答1:

How would I go about debugging this?

Some suggestions for starters:

Ensure that your terminal software is asserting the DTR signal. That was the solution found here.

Temporarily remove the call to power_manage() to ensure that is not part of the problem.

Change APP_UART_FLOW_CONTROL_ENABLED for APP_UART_FLOW_CONTROL_DISABLED to determine whether it is a flow control issue. You will not need flow control for output to a PC in any case. It may be needed if you are inputting to the device (especially with a buffer length of 1) or if you are sending to data to a slow device with limited buffering.

Verify ERR_CODE after calling APP_UART_FIFO_INIT to ensure no problems occurred at that stage. Possible error codes are defined here.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!