TA的每日心情 | 开心 2024-4-25 10:04 |
---|
签到天数: 4 天 连续签到: 1 天 [LV.2]偶尔看看I
|
玩了好几天的板卡,今天来动手做个小Demo吧,作为一个高级点灯工程师,就用手机蓝牙控制板卡点灯吧,主要目的是打通一下手机和板卡之间的通讯链路。
首先我们选择使用上次的“Bluetooth® LE Generic”这个SDK中的“B91_module”这个DEMO,他里面跑的是SPP协议(代码中是这么叫的,我也跟着一起这么叫吧)。DEMO的效果就是B91上有一个串口,通过一个协议可以控制蓝牙的一些配置,还可以实现手机->B91->串口、串口->B91->手机之间数据的传输。可惜我没有找到合适的一个文档来说明这个串口协议是如何使用的,如果你想了解的话,只能自己去看看源码了,今天我不会详细使用这个协议,所以不做太多的讲解
该Demo需要外接一个串口,用于跑对应的SPP协议,在app.c中的user_init_normal()中可以找到串口初始化函数,他配置了使用的串口引脚和波特率
程序烧录后,手机可以搜索到一个名字叫“KModule”的蓝牙
连接成功,串口会定时打印“FF 02 8C 07”,该信息代表的是通道MAP更新事件
手机发一下数据到模块
发送0x41424344
串口收到如下数据
可以看到数据已经收到了,前面的FF-00之间的数据不管他,这是协议上的事,这边不细讲。41-44就是我们收到的数据
接下来就开始改造这个Demo,首先第一步就是要知道,我在那个函数中可以得到手机发过来的数据?
这个我们可以直接看Attribute Table,他就在app_att.c中,关于这个的先关介绍可以看SDK手册的“3.3.3 ATT & GATT”里面有详细的介绍,在下图位置就是注册刚才我们使用的那个服务收到数据的回调函数
我们来看一下回调函数
- int module_onReceiveData(u16 connHandle, rf_packet_att_write_t *p)
- {
- u16 len = p->l2capLen - 3;
- if(len > 0)
- {
- spp_event_t *pEvt = (spp_event_t *)p;
- pEvt->token = 0xFF;
- pEvt->paramLen = p->l2capLen + 2; //l2cap_len + 2 byte (eventId)
- pEvt->eventId = 0x07a0; //data received event
- memcpy(pEvt->param, &p->opcode, len + 3);
- spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
- }
- return 0;
- }
复制代码 其中&p->opcode就是我们收到的数据(事实上他的第一字节不是,而是一个0x00,我还没明白这是为什么),那么我们就可以简单地改造一下这个函数,当我收到4个0xAA时,我就点灯,4个0xBB我就灭灯。
- int module_onReceiveData(u16 connHandle, rf_packet_att_write_t *p)
- {
- u16 len = p->l2capLen - 3;
- uint8_t dataAA[5] = {0x00, 0xAA, 0xAA, 0xAA, 0xAA};
- uint8_t dataBB[5] = {0x00, 0xBB, 0xBB, 0xBB, 0xBB};
- spp_event_t *pEvt = (spp_event_t *)p;
- if(len > 0)
- {
-
- pEvt->token = 0xFF;
- pEvt->paramLen = p->l2capLen + 2; //l2cap_len + 2 byte (eventId)
- pEvt->eventId = 0x07a0; //data received event
- memcpy(pEvt->param, &p->opcode, len + 3);
- }
-
- if (0 == memcmp(&dataAA[0], &p->opcode, 5))
- {
- gpio_write(GPIO_LED_GREEN, LED_ON_LEVAL);
- spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
- }
- else if (0 == memcmp(&dataBB[0], &p->opcode, 5))
- {
- gpio_write(GPIO_LED_GREEN, !LED_ON_LEVAL);
- spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
- }
-
- return 0;
- }
复制代码 视频演示:
|
|