ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NRF52810传输速率测试

2022-01-29 18:32:21  阅读:281  来源: 互联网

标签:code err init NRF 传输速率 NRF52810 测试 BLE DEBUG


NRF52810传输速度测试

最近有项目要用到NRF52810这款蓝牙IC,于是就买了一个板子准备测试一下,项目目前的需求不是很高,传输速度能达到1KB/S就可以了。看网上大家测试的效果都挺不错的,在1M模式下能测试到80KB/S,于是我也想试试,借鉴了一下别人的方法,
前期测试思路是这样的,每10ms发送244个字节,然后连续发送100次,这样的话刚好1秒,然后传输速度的话就是100*244 = 24400B/S,然后后面只需要缩短包间隔就能提高理论传输速率。
于是我就开干了。
一. 环境搭建
测试环境搭建的话我主要参考这篇文章:手把手教你开发自己的BLE
主要思路也是根据这篇文章做了一些改动,环境的话需要改动的是NRF52810打开工程时,打开10040e下的工程,NRF52832是10040。
在看了网上很多篇博客,大家主要修改的主要参数有:
1.增大MTU,在sdk_config.h

// <o> NRF_SDH_BLE_GATT_MAX_MTU_SIZE - Static maximum MTU size. 
#ifndef NRF_SDH_BLE_GATT_MAX_MTU_SIZE
#define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 247   // MTU大小
#endif

2.增大DLE,在sdk_config.h

// <i> Requested BLE GAP data length to be negotiated.

#ifndef NRF_SDH_BLE_GAP_DATA_LENGTH
#define NRF_SDH_BLE_GAP_DATA_LENGTH 251     // DLE 数据长度拓展
#endif

3.打开CLE,在main.c中加入如下代码,放在蓝牙协议栈后面初始化

//status 为true时,打开CLE
void conn_evt_len_ext_set(bool status)
{
    ret_code_t err_code;
    ble_opt_t  opt;

    memset(&opt, 0x00, sizeof(opt));
    opt.common_opt.conn_evt_ext.enable = status ? 1 : 0;

    err_code = sd_ble_opt_set(BLE_COMMON_OPT_CONN_EVT_EXT, &opt);
    APP_ERROR_CHECK(err_code);
}

4.连接事件长度定义,这里我设置的800,在sdk_config.h

// <o> NRF_SDH_BLE_GAP_EVENT_LENGTH - GAP event length. 
// <i> The time set aside for this connection on every connection interval in 1.25 ms units.

#ifndef NRF_SDH_BLE_GAP_EVENT_LENGTH
#define NRF_SDH_BLE_GAP_EVENT_LENGTH 800     

5.调整连接时间间隔,在main.c中

#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(8, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(12, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */

二. 软硬件准备
1.硬件准备
NRF52810模块一个。
支持蓝牙1M模式,2M模式手机一台,我这里用的是HUAWEI P40 PRO。
2.软件准备
打开官方例程ble_app_uart,将第一章的代码片段修改和加入。
创建测试定时器,在main.c中加入如下代码

/**@brief CreateTestTimer
 */
void CreateTestTimer(void)
{
  app_timer_create(&s_testTimer, APP_TIMER_MODE_REPEATED, timer_testCallback);
	app_timer_start(s_testTimer, APP_TIMER_TICKS(10), NULL);   // 10ms定时器
}

增加定时器回调函数,在main.c中加入如下代码

/**
 @brief 
 @param 
 @return 
*/
static void timer_testCallback(void *arg)
{
	UNUSED_PARAMETER(arg);
	nrf_ble_speed_test();   // 传输速度测试
}

添加速度测试函数,在main.c中加入如下代码

/**
 @brief 
 @param 
 @return 
*/
void nrf_ble_speed_test(void)
{
	static uint16_t DEBUG_CNT1 =0,DEBUG_CNT2 = 0;
	uint32_t   err_code;
	uint16_t   length = 244;  // 每一包数据长度
	static uint8_t   head_data =0;
	uint8_t buf[255];
	DEBUG_CNT1 ++;
	if(1){
	    // 头尾数据幅值
		head_data ++;
		if(head_data == 254)head_data = 0;
		buf[0]=head_data;
		buf[length-1]=head_data;
		// 发送数据
		err_code = ble_nus_data_send(&m_nus, buf,&length, m_conn_handle);
		if ((err_code != NRF_ERROR_INVALID_STATE) &&
				(err_code != NRF_ERROR_RESOURCES) &&
				(err_code != NRF_ERROR_NOT_FOUND))
		{
				APP_ERROR_CHECK(err_code);
		}
		// 判断数据是否发送成功,成功则成功次数加一
		if(err_code == NRF_SUCCESS){
			DEBUG_CNT2 ++;
		}
	}
	// 每10ms进入一次,计算1s内理论传输速度和实际传输速度
	if(DEBUG_CNT1 == 100){
		NRF_LOG_INFO("SUCCES Num = %d Theoretical speed = %d B/s Actual speed = %d B/s",DEBUG_CNT2,(DEBUG_CNT1*length),(DEBUG_CNT2*length));
		DEBUG_CNT1 = 0;
		DEBUG_CNT2 = 0;
	}
}

main函数总览

/**@brief Application main function.
 */
int main(void)
{
//	bool erase_bonds;
	uint8_t int_stu = 0;
	// Initialize.
	uart_init();                        // 串口初始化
	log_init();                         // LOG打印初始化  可选UART/RTT
	timers_init();                      // timer初始化 用来生成低功耗计时器
	buttons_leds_init(&erase_bonds);  // 按键和LED初始化,定义按键和LED功能
	power_management_init();            // 低功耗管理模块初始化,通过软件方式让设备自动进入低功耗
	ble_stack_init();                   // 协议初始化,能能蓝牙协议栈,并对其配置
	conn_evt_len_ext_set(1);            // 启用CLE功能
	gap_params_init();                  // GAP参数初始化 用来修改广播名字和连接间隔
	gatt_init();                        // GATT参数初始化 用来修改底层数据包长度
	services_init();                    // 添加蓝牙SERVER和CHARACTERISTIC
	advertising_init();                 // 广播参数初始化 用来修改广播内容、广播间隔及广播超时时间
	conn_params_init();                 // 用来请求更新连接间隔
	// by maozhi 20220127
	CreateTestTimer();     // 初始化定时器
	// Start execution.
//	printf("\r\nUART started.\r\n");
	NRF_LOG_INFO("Debug logging for UART over RTT started.");
	advertising_start();

	// Enter main loop.
	for (;;)
	{
		idle_state_handle();
	}
}

三. 测试及结果
将代码下载到开发板,开始打印如下LOG
测试图

如上图,在手机还没连接时,发送成功的包数为0,理论速度为24400B/S,实际速度为0。打开手机用BLE调试助手连接该模块,BLE软件初次打开默认是1M模式,然后测得到如下结果手机连上之后RTT调试截图手机速率截图
可以看到每秒发送成功的次数为60次左右,最高速率为16KB/S左右,但和理论应该发送100包,速率为24400B/S还有差距,说明中间有很多包没有发送成功。
然后我试着打开BLE的2M模式,点右上角3个点
设置2M模式
勾选LE 2M,然后点击SET,再打开通知,得到如下测试结果
2M模式下测试结果
2M模式下测试速率
可以看到最高实际速度已经来到了24156B/S,成功发送的包数也已经到了99包,但是也还是丢包了,平均速度23KB/S左右,确实2M模式要比1M模式下丢包很少。
目前的测试结果就是这样了,而且不同手机测出来的结果也会不一样,我用了另一台不同型号的手机来测试,速度却慢了很多。
最后因为时间的问题,我就先不做深究了,老大该炒我鱿鱼了。如果大家有和我有过类似环境下的测试,测试的结果很接近蓝牙的理论值的,请在下方评论,我会在以后的某一天将改正后的测试结果和方法分享出来。
第一篇博客,欢迎大家指正,谢谢。

标签:code,err,init,NRF,传输速率,NRF52810,测试,BLE,DEBUG
来源: https://blog.csdn.net/qq_39905727/article/details/122744680

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有