目录
2.1 在 wireless_uart.h 里面的删改... 1
2.2 在 wireless_uart.c 里面的删改... 1
一、 问题描述
在 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》
评论