在使用NRF52832的模组测试官方给的串口例程的时候,发现当改了串口的引脚号之后,就不会出现广播。
解决方法: nrfx_uarte.c文件中,修改函数
nrf_gpio_cfg_input(p_config->pselcts, NRF_GPIO_PIN_PULLUP);引脚状态为上拉,因为模块的引脚当串口使用的时候是悬空的,所以必须要有上拉才能有稳定的信号。
路径nRF5_SDK_13.0.0_04a0bfd\examples\ble_peripheral\ble_app_uart
通过修改广播的发现模式设置nrf52832一直广播
BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE:有限可发现模式,不支持BR/EDR。
BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE:一般可发现模式,不支持BR/EDR。
有限可发现模式和一般可发现模式的主要区别是:
有限可发现模式有时间的限制,一般维持的时间是30秒,而一般可发现模式没有时间的限制。
有限可发现模式广播的间隔比一般可发现模式小。 从时间的限制上,我们可以看出有限可发现模式对连接的迫切性和目的性比一般可发现模式高,一个处于有限可发现模式的设备正在广播,那么他一定是刚被用户操作过并且极希望被连接。 一般情况下,设备首次开机、按下连接按钮,设备进入有限可发现模式比较合适。如果在有限可发现模式时间内没有被连接,可以转入一般可发现模式。 如果我们希望设备在没有被连接时一直保持广播,那么应该使用一般可发现模式,因为一般可发现模式是没有时间限制的。
在advertising_init()函数中修改,
将 advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE
修改为 advdata.flags= BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE
然后修改广播超时时间为0
#define APP_ADV_TIMEOUT_IN_SECONDS 0
在广播初始化的函数中,如果要修改官方工程默认的参数,需要调用协议闭源函数;
static void advertising_init(void)
{
uint32_t err_code;
ble_advertising_init_t init;
ble_advdata_conn_int_t adv_conn_params;
int8_t tx_power_level =TX_POWER_LEVEL;//设置发射功率
memset(&init, 0, sizeof(init));
init.advdata.name_type = BLE_ADVDATA_FULL_NAME;//广播蓝牙名
init.advdata.include_appearance = true;//广播外观
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;//广播类型
//init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
init.advdata.p_tx_power_level=&tx_power_level;//广播发射功率
init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);//广播UUID
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
init.config.ble_adv_fast_enabled = true;//广播间隔
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
init.evt_handler = on_adv_evt;
adv_conn_params.min_conn_interval = MIN_CONN_INTERVAL;//连接间隔
adv_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
init.advdata.p_slave_conn_int=&adv_conn_params;
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}
在这里要广播的数据如果太多,出现广播的字节不够用,会优先将设备广播名称由全名自动切换为短名。
nRF52832的MTU最大支持247字节,但是SDK默认的不是最大, 修改方法如下:
1.改变"sdk_config.h"头文件中相关宏
//
#ifndef NRF_SDH_BLE_GATT_MAX_MTU_SIZE
#define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 247
#endif
2.修改nrf_ble_gatt_att_mtu_periph_set()函数的入参
err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, 64);
APP_ERROR_CHECK(err_code);
默认的是64,最大可以改成247。
3.修改如下两个宏的值
#define OPCODE_LENGTH 1
#define HANDLE_LENGTH 2
这两个宏默认值1和2,总共占用3个字节。这是NUS协议层的头部需要占用的空间,可以不要。将这两个宏的值改为0,省出3个字节来。
4.用手机连接测试。如果手机蓝牙是4.2及以上的话,就会看到主从机之间协商的MTU为247
发送数据量和时间
1,前导码,1个字节
2,接入地址,4个字节
3,包头,2字节
4,广播地址,6个字节
5,有效数据,0~31个字节
如果PHY是1Mbps,1bit需要的时间1us,那发送一次广播包数据量:
1 + 4 + 2 + 6 +31 = 44个字节(有效数据按照最大31计算)
蓝牙4.2的广播数据31字节,蓝牙5.0的广播数据255字节
详情连接:https://blog.csdn.net/H_O_W_E/article/details/50628568?utm_medium=distribute.pc_relevant_download.none-task-blog-2~default~blogcommendfrombaidu~default-2.nonecase&dist_request_id=1330144.32790.16182100650660959&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-2~default~blogcommendfrombaidu~default-2.nonecas
1自己写了一个keysensor.c和keysensor.h文件,然后要添加我的工程中去,首先可以在工程中新建一个文件夹专门放自定义的库文件
2建好文件夹之后,将自定义的库文件添加进去,自定义的文件可以直接添加或者拷贝其他工程现有的文件
注意添加的时候只需要添加.C文件就可以了。.h文件会自动添加。
1.点击工程名右键,选择option
2.选择 common
3.选择 preprocessor,然后双击右侧User include directories
本例子中,自定义的文件的绝对路径是:E:\8.Project_Number\BLE_LED\examples\ble_peripheral\ble_app_blinky
添加相对路径写成:../../../ble_app_blinky
注意:此处的工程一级目录的路径我们认为是:BLE_LED