Hi,
I am developing application on NRF52840 with Zepyr 2.1.2 SDK, and I found two problems when using the example scan_adv, as follows:
- Executing bt_le_scan_start in the main function can receive data smoothly, but using function scan_start() can not receive data, the same problem also occurs in bt_le_adv_start().
- Executing bt_le_scan_stop() still cannot stop scanning.
My codeis as below:
#include <zephyr/types.h>
#include <stddef.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/util.h>
#include <zephyr/toolchain.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/hci.h>
#include <device.h>
#include <devicetree.h>
#include <drivers/gpio.h>
struct bt_le_scan_param scan_param = {
.type = BT_HCI_LE_SCAN_PASSIVE,
.options = BT_LE_SCAN_OPT_NONE,
.interval = BT_GAP_SCAN_FAST_INTERVAL,
.window = 0x0010,
};
const struct device *dev;
int state = 1, adv_state;
int8_t rssi_data [8][8] = {0};
static uint8_t mfg_data[] = { 0xff, 0xff, 0x01 };
static const struct bt_data ad[] = {
BT_DATA(BT_DATA_MANUFACTURER_DATA, mfg_data, 3),
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME,DEVICE_NAME_LEN)
};
void scan_cb(const bt_addr_le_t *addr, int8_t rssi, uint8_t adv_type,
struct net_buf_simple *buf)
{...}
void adv_start(uint8_t mfg){
mfg_data[2] = mfg;
int err = bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad), NULL, 0);
if (err) {
printk("Advertising failed to start (err %d)\n", err);
return;
}
k_sleep(K_MSEC(400));
}
static void adv_stop(){
int err = bt_le_adv_stop();
if (err) {
printk("Advertising failed to stop (err %d)\n", err);
return;
}
k_sleep(K_MSEC(400));
}
void scan_start(){
int err = bt_le_scan_start(&scan_param, scan_cb);
if (err) {
printk("Starting scanning failed (err %d)\n", err);
return;
}
k_sleep(K_MSEC(400));
}
static void scan_stop(){
int err = bt_le_scan_stop();
if (err) {
printk("Stop scanning failed (err %d)\n", err);
return;
}
k_sleep(K_MSEC(400));
}
void main(void)
{
int err = bt_enable(NULL);
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return;
}
printk("Bluetooth initialized\n");
scan_start();
/* if not use scan_start()
*********************************************************
int err = bt_le_scan_start(&scan_param, scan_cb);
if (err) {
printk("Starting scanning failed (err %d)\n", err);
return;
}
k_sleep(K_MSEC(400));
********************************************************
*/
k_sleep(K_MSEC(800));
//scan_stop();
int err = bt_le_adv_stop();
if (err) {
printk("Advertising failed to stop (err %d)\n", err);
return;
}
k_sleep(K_MSEC(400));
while(1);
}
Thanks.
