Environment: nRF connect SDK 1.9.1
Hardware: nrf5340 dk
We try to send data by BLE NUS. According to excemple Bluetooth: Peripheral UART and Bluetooth: Throughput, we developed a program to send data from peripheral kit. We try to use LE 2M PHT. While the send speed is only about 8Kbps. The sample Bluetooth: Throughput achieves about 1Mbps. We want to know where the problem is. The configuration file parameter is wrong or there is a problem with the code writing.
There is the prj.conf
# 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="Smile_ble" CONFIG_BT_DEVICE_APPEARANCE=833 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 # Enable DK LED and Buttons library CONFIG_DK_LIBRARY=y # This example requires more workqueue stack 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_ASSERT=y #throuhput CONFIG_BT_USER_DATA_LEN_UPDATE=y CONFIG_BT_USER_PHY_UPDATE=y CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n CONFIG_BT_BUF_ACL_RX_SIZE=251 CONFIG_BT_ATT_PREPARE_COUNT=2 CONFIG_BT_CONN_TX_MAX=10 CONFIG_BT_L2CAP_TX_BUF_COUNT=10 CONFIG_BT_L2CAP_TX_MTU=247 CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y CONFIG_BT_CTLR_PHY_2M=y CONFIG_BT_CTLR_RX_BUFFERS=5 CONFIG_BT_BUF_ACL_TX_COUNT=10 CONFIG_BT_BUF_ACL_TX_SIZE=251 CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 CONFIG_BT_PERIPHERAL_PREF_MIN_INT=12 CONFIG_BT_PERIPHERAL_PREF_MAX_INT=15
There is a main part of main.cpp
void main(void)
{
int blink_status = 0;
int err = 0;
configure_gpio();
err = bt_enable(NULL);
if (err) {
error();
}
LOG_INF("Bluetooth initialized");
k_sem_give(&ble_init_ok);
if (IS_ENABLED(CONFIG_SETTINGS)) {
settings_load();
}
err = bt_nus_init(&nus_cb);
if (err) {
LOG_ERR("Failed to initialize UART service (err: %d)", err);
return;
}
err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad), sd,
ARRAY_SIZE(sd));
if (err) {
LOG_ERR("Advertising failed to start (err %d)", err);
return;
}
dummy[0]=0x55;
dummy[243] = 0x55;
for (;;) {
dk_set_led(RUN_STATUS_LED, (++blink_status) % 2);
k_sleep(K_MSEC(RUN_LED_BLINK_INTERVAL));
}
}
void ble_write_thread(void)
{
/* Don't go any further until BLE is initialized */
uint32_t data = 0;
uint32_t prog = 0;
uint64_t stamp;
int64_t delta;
int err=0;
uint16_t index=0x55;
struct uart_data_t buf;
// k_sem_take(&ble_init_ok, K_FOREVER);
k_sem_take(&ble_conn_ok, K_FOREVER);
if (bt_nus_send(NULL, dummy, 1)) {
LOG_ERR(" byte2 failed!!");
}
printk(" 1byte succeed!!");
stamp = k_uptime_get_32();
while (prog < IMG_SIZE) {
/* Wait indefinitely for data to be sent over bluetooth */
// struct uart_data_t *buf = k_fifo_get(&fifo_uart_rx_data,
// K_FOREVER);
if (bt_nus_send(NULL, dummy, 244)) {
LOG_ERR("Failed to send data over BLE connection\n");
continue;
}
/* print graphics */
printk("%c", img[prog / IMG_X][prog % IMG_X]);
data += 244;
prog++;
// k_free(buf);
}
delta = k_uptime_delta(&stamp);
printk("\nDone\n");
printk("[local] sent %u bytes (%u KB) in %lld ms at %llu kbps\n",
data, data / 1024, delta, ((uint64_t)data * 8 / delta));
for(;;)
{
k_sleep(K_MSEC(5000));
//LOG_INF("\ntest done\n");
}
}
K_THREAD_DEFINE(ble_write_thread_id, STACKSIZE, ble_write_thread, NULL, NULL,
NULL, PRIORITY, 0, 0);