Hello,
I am programming BLE with the nRF52840-DK. [Toolchain Manager: v1.3.0, IDE: Visual Studio Code (VSCode), SDK: ncs v2.6.0 ]
I want to debug using the Logger module. Printing with the 'printk' function works fine, but nothing is output when I use the 'LOG_INF' function.
I wonder what I'm doing wrong.
Additionally, I have another question. If I set the following in prj.conf:
CONFIG_LOG=y CONFIG_LOG_BACKEND_RTT=n CONFIG_LOG_BACKEND_UART=y CONFIG_LOG_PRINTK=n
Will the output from 'LOG_INF' be directed to' COM' instead of 'RTT'?
Is this different from the printk function?"
- Here is my 'main.c' code:
#include <zephyr/bluetooth/conn.h>
#include <zephyr/sys/printk.h>
#include <zephyr/kernel.h>
#include <zephyr/settings/settings.h>
#include <zephyr/logging/log.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <bluetooth/services/nus.h>
#include <zephyr/logging/log.h>
#define STACKSIZE CONFIG_BT_NUS_THREAD_STACK_SIZE
#define PRIORITY 7
int count = 0;
#define LOG_MODULE_NAME cho
LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#define DEVICE_NAME "SEONGMIN"
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)
static K_SEM_DEFINE(ble_init_ok, 0, 1);
static struct bt_conn *current_conn;
static struct bt_conn *auth_conn;
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
};
static const struct bt_data sd[] = {
BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_NUS_VAL),
};
/***************************************************/
/****************** *****************/
/***************************************************/
static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey){
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
LOG_INF("Passkey for %s: %06u", addr, passkey);
}
static void auth_passkey_confirm(struct bt_conn *conn, unsigned int passkey){
char addr[BT_ADDR_LE_STR_LEN];
auth_conn = bt_conn_ref(conn);
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
LOG_INF("Passkey for %s: %06u", addr, passkey);
LOG_INF("Press Button 1 to confirm, Button 2 to reject.");
}
static void auth_cancel(struct bt_conn *conn){
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
LOG_INF("Pairing cancelled: %s", addr);
}
static struct bt_conn_auth_cb conn_auth_callbacks = {
.passkey_display = auth_passkey_display,
.passkey_confirm = auth_passkey_confirm,
.cancel = auth_cancel,
};
static void pairing_complete(struct bt_conn *conn, bool bonded){
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
LOG_INF("Pairing completed: %s, bonded: %d", addr, bonded);
}
static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason){
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
LOG_INF("Pairing failed conn: %s, reason %d", addr, reason);
}
static struct bt_conn_auth_info_cb conn_auth_info_callbacks = {
.pairing_complete = pairing_complete,
.pairing_failed = pairing_failed
};
/***************************************************/
/****************** *****************/
/***************************************************/
static void connected(struct bt_conn *conn, uint8_t err)
{
char addr[BT_ADDR_LE_STR_LEN];
if (err) {
LOG_INF("connected: Connection failed (err %u)", err);//printk("connected: Connection failed (err %u)\n", err);
return;
}
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
LOG_INF("Connected %s", addr); //printk("Connected %s\n", addr);
current_conn = bt_conn_ref(conn);
}
static void disconnected(struct bt_conn *conn, uint8_t reason)
{
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
LOG_INF("Disconnected: %s (reason %u)", addr, reason); //printk("Disconnected: %s (reason %u)\n", addr, reason);
}
static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t latency, uint16_t timeout)
{
LOG_INF("Connection parameters updated.\n"
" interval: %d, latency: %d, timeout: %d\n",
interval, latency, timeout);
}
static void le_data_length_updated(struct bt_conn *conn, struct bt_conn_le_data_len_info *info){
LOG_INF("LE data len updated: TX (len: %d time: %d)"
" RX (len: %d time: %d)\n", info->tx_max_len,
info->tx_max_time, info->rx_max_len, info->rx_max_time);
}
static struct bt_conn_cb conn_callbacks = {
.connected = connected,
.disconnected = disconnected,
.le_param_updated = le_param_updated,
.le_data_len_updated = le_data_length_updated,
};
/***************************************************/
/****************** *****************/
/***************************************************/
static void bt_receive_cb(struct bt_conn *conn, const uint8_t *const data, uint16_t len)
{
char addr[BT_ADDR_LE_STR_LEN] = {0};
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, ARRAY_SIZE(addr));
LOG_INF("Received data from: %s", addr); //printk("Received data from: %s\n", addr);
}
//(*sent)(struct bt_conn *conn);
static void bt_sent_cb(struct bt_conn *conn){
LOG_INF("bt_sent_cb");//printk("bt_sent_cb\n");
}
static struct bt_nus_cb nus_cb = {
.received = bt_receive_cb,
.sent = bt_sent_cb,
};
uint8_t data_to_central[244];
#define MTU_SIZE 64
int main(void){
int err;
for(int x=0; x<244; x++){
data_to_central[x] = x;
}
//printk("cho >> 240703_scan_adv_peripheral\n");
LOG_INF("cho >> 240703_scan_adv_peripheral");
bt_conn_cb_register(&conn_callbacks);
err = bt_conn_auth_cb_register(&conn_auth_callbacks); //success: 0
//printk("bt_conn_auth_cb_register: %d\n",err);
LOG_INF("bt_conn_auth_cb_register: %d",err);
err = bt_conn_auth_info_cb_register(&conn_auth_info_callbacks); //success: 0
//printk("bt_conn_auth_info_cb_register: %d\n",err);
LOG_INF("bt_conn_auth_info_cb_register: %d",err);
err = bt_enable(NULL);
//printk("bt_enable: %d\n",err);
LOG_INF("bt_enable: %d",err);
k_sem_give(&ble_init_ok);
if (IS_ENABLED(CONFIG_SETTINGS)) {
settings_load();
}
err = bt_nus_init(&nus_cb);
LOG_INF("bt_nus_init: %d",err);//printk("bt_nus_init: %d\n",err);
err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
LOG_INF("bt_le_adv_start: %d",err); //printk("bt_le_adv_start: %d\n",err);
for (;;) {
k_sleep(K_MSEC(1000));
}
}
void ble_write_thread(void){
k_sem_take(&ble_init_ok, K_FOREVER);
for (;;){
for(int y =0; y< 244; y++){
if (bt_nus_send(NULL, data_to_central, MTU_SIZE)) {
LOG_INF("."); //failed
}else{
LOG_INF("-"); //success
}
LOG_INF("count: %d", count); //printk("count: %d\n", count);
count++;
k_sleep(K_MSEC(1000));
}
}
}
K_THREAD_DEFINE(ble_write_thread_id, STACKSIZE, ble_write_thread, NULL, NULL, NULL, PRIORITY, 0, 0);
- Here is my 'prj.conf' code:
# Enable the UART driver CONFIG_UART_ASYNC_API=y CONFIG_NRFX_UARTE0=y CONFIG_SERIAL=y CONFIG_GPIO=y # Make sure printk is printing to the UART console CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_HEAP_MEM_POOL_SIZE=2048 CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DEVICE_NAME="SEONGMIN" CONFIG_BT_MAX_CONN=1 CONFIG_BT_MAX_PAIRED=1 # Enable the NUS service CONFIG_BT_NUS=y # Enable bonding CONFIG_BT_SETTINGS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_NVS=y CONFIG_SETTINGS=y # This example requires more stack CONFIG_MAIN_STACK_SIZE=1152 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 # Config logger CONFIG_LOG=y CONFIG_USE_SEGGER_RTT=y CONFIG_LOG_BACKEND_RTT=y CONFIG_LOG_BACKEND_UART=n CONFIG_LOG_PRINTK=n #CONFIG_LOG_PROCESS_THREAD=y #CONFIG_LOG_DEFAULT_LEVEL=4 # Ensure sufficient buffer size for RTT # CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=1024 # CONFIG_SEGGER_RTT_BUFFER_SIZE_DOWN=16 CONFIG_ASSERT=y CONFIG_BT_USER_DATA_LEN_UPDATE=y