蓝牙设备理论上均可实现该功能,本篇以Hid键盘为例,
本篇以串口中断的方式为例发送密码,↓
uint8_t TxBuff[] = "This is a tx exam\r\n";/*TxBuff用来测试串口中断是否正常使用*/
uint8_t RxBuff[];/*RxBuff用来接收串口发来的密码*/
uint8_t trigB;/*串口一包数据缓存几个字节*/
紧接着在main函数中配置串口中断,这边程序中我使用的串口为串口3,↓
GPIOA_SetBits(GPIO_Pin_5);
GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
UART3_DefInit();
UART3_SendString(TxBuff, sizeof(TxBuff));
UART3_ByteTrigCfg(UART_7BYTE_TRIG);
trigB = 7;
UART3_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
PFIC_EnableIRQ(UART3_IRQn);
然后写下串口中断程序,↓
/* 串口3中断 */
uint8_t Rcvlen;
__INTERRUPT
__HIGH_CODE
void UART3_IRQHandler(void)
{
if(UART3_GetITFlag())
{
Rcvlen = UART3_RecvString(RxBuff);
UART3_SendString(RxBuff, Rcvlen);
}
}
我们回到Hid_dev.c文件中外部声明这两个变量Rcvlen和RxBuff[ ]使用,↓
extern uint8_t Rcvlen;
extern uint8_t RxBuff[];
定义PASSKEY_EVE事件,↓
给hidEmuConnHandle这个连接处理函数在head文件中声明一下,以便我们hiddev.c函数能够使用,↓
接下来我们在蓝牙部分写上配对码接收功能,↓
①改宏定义,↓
②编写PASSKEY事件,↓
if ( events & PASSKEY_EVT )
{
//printf("enter passcode\n\r");
uint32 passkey=0 ;
if((Rcvlen==6))
{
printf("rcvlen:%d\n\r",Rcvlen);
for(u8 i=0;i<6;i++) //密码是10进制数输入,需要进制进制转换
{
for(u8 i=0;i<6;i++)
{
printf("%x ",RxBuff[i]);
}
printf("\r\n");
passkey=10*passkey;
passkey+=(RxBuff[i]-0x30);
}
PRINT("passkey:%d\r\n",passkey);
Rcvlen =0;
GAPBondMgr_PasscodeRsp( hidEmuConnHandle, SUCCESS, passkey ); //输入密码
}
else {
tmos_start_task(hidDevTaskId,PASSKEY_EVT,400);//如果没有接收到密码,重新开启任务
}
return ( events ^ PASSKEY_EVT );
}
③应用这个Passkey事件,↓
④本以为修改到这里就可以了,结果配对过程中一直配对不成功,寻找原因,开启配对码之后这个地方不能再使用自身地址,需屏蔽此处代码,↓
⑤到这里,代码部分就修改完毕了,接下来编译程序无误,烧录进我们的CH582芯片,进PC端蓝牙配对界面,↓
到此配对流程结束。
如果按照本篇博客修改仍然未成功,这边把修改完的程序放在百度网盘中,有意者自取。
百度网盘链接:https://pan.baidu.com/s/1OZhh1-9YD5YHJNcaJl5JwA
提取码:kbwf