KW3x wireless_uart 例程连接获取 RSSI

目录

一、问题描述... 1

二、删改代码过程... 1

2.1 在 wireless_uart.h 里面的删改... 1

2.2 在 wireless_uart.c 里面的删改... 1

三、结果... 3

四、参考文档... 5

 

一、 问题描述

在 wireless_uart 例程中连接获取 RSSI 。

工具:NXP FRDM-KW36 开发板、手机APP->nRF Connect、XCOM V2.0。|

 

二、删改代码过程

2.1 在 wireless_uart.h 里面的删改

在 wireless_uart.h 里面,更改宏定义:

#define gWuart_CentralRole_c 0

#define gWuart_PeripheralRole_c 1

 

2.2 在 wireless_uart.c 里面的删改

(1)增加的全局变量:

static tmrTimerID_t mRssiMeasurementTimerId = gTmrInvalidTimerID_c;

deviceId_t mPeerDeviceId;

volatile int8_t rssi1=0;

char rssiString[20];


(2)增加的宏定义或声明

#define mRssiReportInterval_c           (1)

static void RssiMeasuermentCallback(void * pParam);


(3)增加的函数:

static void RssiMeasuermentCallback(void * pParam){
(void)Gap_ReadRssi(mPeerDeviceId);
}

 
(4) 在 BleApp_Config() 里面,

屏蔽以下代码:

(void)App_RegisterGattClientProcedureCallback(BleApp_GattClientCallback);
(void)GattServer_RegisterHandlesForWriteNotifications(NumberOfElements(mCharMonitoredHandles), mCharMonitoredHandles);

BleServDisc_RegisterCallback(BleApp_ServiceDiscoveryCallback);

/* Start services */
(void)Wus_Start(&mWuServiceConfig);

mBasServiceConfig.batteryLevel = BOARD_GetBatteryLevel();

(void)Bas_Start(&mBasServiceConfig);

mUartStreamFlushTimerId = TMR_AllocateTimer();

mBatteryMeasurementTimerId = TMR_AllocateTimer();

 增加以下代码:

/* 申请定时器定期申请获取 RSSI */
mRssiMeasurementTimerId = TMR_AllocateTimer();


(5)在 BleApp_ConnectionCallback() 里面,

在 gConnEvtConnected_c 事件中屏蔽以下代码:

    /* Subscribe client*/
(void)Wus_Subscribe(peerDeviceId);
(void)Bas_Subscribe(&mBasServiceConfig, peerDeviceId);

if (!TMR_IsTimerActive(mBatteryMeasurementTimerId)){
/* Start battery measurements */
(void)TMR_StartLowPowerTimer(mBatteryMeasurementTimerId,gTmrLowPowerIntervalMillisTimer_c,TmrSeconds(mBatteryLevelReportInterval_c), BatteryMeasurementTimerCallback, NULL);
}

在 gConnEvtConnected_c 事件中增加以下代码:

     mPeerDeviceId=peerDeviceId;

/* 启动申请 RSSI 的定时器 */

if (!TMR_IsTimerActive(mRssiMeasurementTimerId)){
(void)TMR_StartLowPowerTimer(mRssiMeasurementTimerId,gTmrLowPowerIntervalMillisTimer_c,TmrSeconds(mRssiReportInterval_c), RssiMeasuermentCallback, NULL);
}


在 gConnEvtDisconnected_c 事件中屏蔽以下代码:

      /* Unsubscribe client */
(void)Wus_Unsubscribe();
(void)Bas_Unsubscribe(&mBasServiceConfig, peerDeviceId);
(void)TMR_StopTimer(mBatteryMeasurementTimerId);

 
增加 gConnEvtRssiRead_c 事件

      case gConnEvtRssiRead_c:
/* 获取 RSSI 值 */
rssi1 = pConnectionEvent->eventData.rssi_dBm;
sprintf(rssiString,"Rssi:%ddBm",rssi1);
(void)Serial_Print(gAppSerMgrIf,rssiString, gAllowToBlock_d);
break;

 

         以上,开启定时器之后,用于定时读取 RSSI 值,结果在 gConnEvtRssiRead_c 事件中。

 

三、结果

         将代码烧录进 FRDM-KW36 板子,然后一开始上电打印出的数据如图 1,且此时手机没有扫描到该广播:

      
                                  图  1

         此时按下 SW2,开启广播,打印出广播,如图 2,此时手机扫描到广播,如图 3。(注意:此时是已经开启过滤,只显示名称有 nxp 的广播设备)

     
                                       图  2

             
                                            图  3

         按下手机软件上的 CONNECT ,进行连接,此时打印如图 4,手机上的软件显示如图 5。


                                    图  4

         
                                  图  5

 

四、参考文档

(1) NXP:《MKW36A512RM.pdf》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论