Nordic SDK打印到串口

我有一个运行在Nordic SDK上的Arduino设备(它是Red Bear Lab BLE nano)。 我希望能够在GTKTerm中进行串行打印,以便能够调试我的代码中发生的事情。 为此,我有以下代码:

/* * 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  #include  #include  #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(); } } 

我遇到的问题是,有时我会在GTKterm中看到输出。 我无法找到工作时和不工作时的模式。 我该如何调试呢?

我该如何调试呢?

对初学者的一些建议:

确保终端软件正在断言DTR信号。 这就是这里找到的解决方案。

暂时删除对power_manage()的调用,以确保不是问题的一部分。

APP_UART_FLOW_CONTROL_DISABLED更改APP_UART_FLOW_CONTROL_ENABLED以确定它是否是流量控制问题。 在任何情况下,您都不需要流量控制来输出到PC。 如果您正在输入设备(特别是缓冲区长度为1),或者您要将数据发送到缓冲设备有限的慢速设备,则可能需要它。

调用ERR_CODE后validationERR_CODE以确保在该阶段没有问题。 此处定义了可能的错误代码。