日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BLE-NRF51822教程8-动态广播

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BLE-NRF51822教程8-动态广播 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本講接收如何實現動態廣播。

教程基于?9.0 sdk中的?Uart例子。

?

實現動態廣播的方法是??廣播->停止廣播->修改參數->重啟廣播

?

所以我們通過一個定時器來周期性的??關閉廣播然后再修改廣播數據之后再開啟廣播。

?

Sdk 9.0中的廣播搞了好幾個模式,做的有點麻煩,所以我對他做了比較大的改動。

首先 在main.c中 中的advertising_init函數需要改動。

?

主要修改還添加了紅色部分。將?flag?改為了GENERAL。后面又將廣播超時設置為0從而實現無線廣播。

去掉了根據廣播模式來設置廣播數據的函數以及對 掃描響應數據的設置。

void advertising_init(void)

{

??? uint32_t????? err_code;

??? ble_advdata_t advdata;

??? ble_advdata_t scanrsp;

?

??? memset(&advdata, 0, sizeof(advdata));

??? advdata.name_type????????? = BLE_ADVDATA_FULL_NAME;

??? advdata.include_appearance = false;

????advdata.flags????? = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;

?? static ble_advdata_manuf_data_t manuf_data;

?? static uint8_t mydata = 0;? //這里用的是靜態數據

??????????????????????????? //這里做的動態廣播就是每次調用這個函

??????????????????????????? //數,廣播數據中的廠商定義字段都會加1

??

?? manuf_data.company_identifier = 0xffaa;

?? manuf_data.data.size = 1;

?? manuf_data.data.p_data = &mydata;

??

?? mydata++; //每次調用后加1

?? advdata.p_manuf_specific_data = &manuf_data;

?? err_code = ble_advdata_set(&advdata, NULL);

??? APP_ERROR_CHECK(err_code);

}

?

?

?

?

?

然后是啟動廣播函數。?Main?函數中用的是ble_advertising_start。

我們這里不用。直接實現一個自己的簡單函數

?

void myadv_start(void){

???

??? ble_gap_adv_params_t adv_params;

???

??? adv_params.interval = 1600; //這里廣播間隔設置為?1s

????adv_params.timeout = 0;//這里設置0和上面的flag配合實現無線廣播

??? adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;

??? adv_params.channel_mask.ch_37_off = 0;

??? adv_params.channel_mask.ch_38_off = 0;

??? adv_params.channel_mask.ch_39_off = 0;

???

??? adv_params.type??????? = BLE_GAP_ADV_TYPE_ADV_IND;

??? adv_params.p_peer_addr = NULL;

??? adv_params.fp????????? = BLE_GAP_ADV_FP_ANY;

??? adv_params.p_whitelist = NULL;

???

??? sd_ble_gap_adv_start(&adv_params);

???

}

?

之后我們做一個定時器。定時器的作用是以2s為周期 來關閉修改廣播參數然后啟動廣播

?

?

?

?

?

?

?

?

在main?函數中做如下修改,創建一個?2s定時器?my_timer,并且開啟它

?

int main(void)

{

??? uint32_t err_code;

??? bool erase_bonds;

??? uint8_t? start_string[] = START_STRING;

??? app_timer_id_t my_timer;

??? // Initialize.

???

??? APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, ???????????????????????????? ??? APP_TIMER_OP_QUEUE_SIZE, false);

??? uart_init();

????app_timer_create(&my_timer,APP_TIMER_MODE_REPEATED,

?????????????????????????????? my_timer_handler);

??? buttons_leds_init(&erase_bonds);

??? ble_stack_init();

??? gap_params_init();

??? services_init();

??? advertising_init();

??? conn_params_init();

??

???

????app_timer_start(my_timer, APP_TIMER_TICKS(2000,APP_TIMER_PRESCALER), NULL);

??

????myadv_start(); //這里用的自己定義的啟動廣播函數

?

??? for (;;)

??? {

??????? power_manage();

??? }

}

?

?

?

?

然后實現自己的 定時器的溢出處理函數

?

void my_timer_handler(void *p_contex){

??? int i =50;

??? sd_ble_gap_adv_stop();?? //關廣播

??? advertising_init();????? //修改廠商自定義字段中的數據

??? while(i--);

??? myadv_start();?????????? //開啟廣播

}

?

這里做的動態廣播是動態修改廣播數據中的 廠商自定義字段。每次調用

advertising_init 函數的時候廠商自定義字段的值都會遞增。在advertising_init函數中有注釋說明

?

?

?

到這里動態廣播要做的事已經做完了。

不過在uart例子中還需要做一個改動,我們創建了一個自己的timer,不過uart例子中定義的 允許使用的最大的?timer數就是它已經使用的數量,所以我們再添加自己的timer會出錯。

?

修改辦法:找到main.c文件中的APP_TIMER_MAX_TIMERS宏將其增大1就可以了

?

之后燒錄程序就能看到廣播數據中的廠商自定義字段在動態改變了

總結

以上是生活随笔為你收集整理的BLE-NRF51822教程8-动态广播的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。