@TOC
W801藍牙收發數據與控制設計(一)-INDICATE
W801藍牙收發數據與控制設計(二)-NOTIFY
本文使用環境:
主控:W801 (開發板)
兼容:W800 AIR101
^^^^這篇教程主要介紹W801的BT使用,之前我一直存在畏難情緒,看著官方提供的碩大的SDK,難以下手。幸虧有前輩將BT剝離了出來,因此本文在前輩的基礎上進一步完善程序,並將程序上傳github,供大家參考。本文github地址。
^^^^程序功能: 通過手機藍牙控制開發板的多個LED亮滅,同時開發板通過藍牙返回收到的數據。
注意: 在藍牙發送數據時,數據長度必須要小於254,否者接收不成功,同時數據接收按照u8類型接收,大家可以根據實際情況進行修正。
1、修改demo文件
^^^^打開 wm_demo.h文件,做如下修改:
//demo console
#define DEMO_CONSOLE DEMO_ON//DEMO_OFF
2、修改main文件
^^^^打開 mian.c文件,做如下修改:
void UserMain(void)
{
//add by zxx start
My_task();
//add by zxx end
}
3、添加task任務
^^^^打開 wm_demo_console_task.c文件,添加如下函數:
//add by zxx start
//以下幾行代碼添加在文件的開頭
#define MYBLE_TASK_SIZE 2048
static OS_STK MyBLETaskStk[MYBLE_TASK_SIZE];
#define MYBLE_TASK_PRIO 32
//以下文件添加在文件的末尾
void my_ble_msg_task(void *sdata)
{
//傳過來的消息隊列指針,這裡我定義的是u8類型的
u8 *msg;
//藍牙發送數據
u8 send_data[20] = {0x00};
demo_bt_enable();
while(bt_adapter_state == WM_BT_STATE_OFF)
{
tls_os_time_delay(5000 /HZ);
}
tls_os_time_delay(5000 /HZ);
demo_ble_server_on();
printf("ble ready ok \r\n");
tls_gpio_cfg(WM_IO_PB_05, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_25, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_26, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
for(;;)
{
tls_os_queue_receive(ble_q,&msg, 0, 0);
//打印le收到數據的長度
printf("ble revice len:%d\n",msg[0]);
//依次打印收到的ble數據
for(u8 i=0;i<msg[0];i++){
printf("%x ",msg[i+1]);
//收到的數據存到send_data buff
send_data[i] = msg[i+1];
}printf("\n");
if(msg[1] != 0)
tls_gpio_write(WM_IO_PB_05,1);
else
tls_gpio_write(WM_IO_PB_05,0);
if(msg[2] != 0)
tls_gpio_write(WM_IO_PB_25,1);
else
tls_gpio_write(WM_IO_PB_25,0);
if(msg[3] != 0)
tls_gpio_write(WM_IO_PB_26,1);
else
tls_gpio_write(WM_IO_PB_26,0);
//返回收到的數據
printf("send state:%d \r\n",tls_ble_server_demo_api_send_msg(send_data,3));
}
}
void My_task(void)
{
if(tls_os_queue_create(&ble_q, 32)!=TLS_OS_SUCCESS)
{
printf("create queue fail\n");
return;
}
tls_os_task_create(NULL, NULL,
my_ble_msg_task,
NULL,
(void *)MyBLETaskStk, /* task's stack start address */
MYBLE_TASK_SIZE * sizeof(u32), /* task's stack size, unit:byte */
MYBLE_TASK_PRIO,
0);
}
//add by zxx end
4、修改藍牙數據接收函數
^^^^打開 wm_ble_server_api_demo.c文件,對gatt_svr_chr_demo_access_func
函數做如下修改:
//add by zxx start
tls_os_queue_t *ble_q = NULL;
//重新定義一個數據uff
//ble_data[0] 表示數據的長度,往後依次為數據
u8 ble_data[255] = {0};
//add by zxx end
static int
gatt_svr_chr_demo_access_func(uint16_t conn_handle, uint16_t attr_handle,
struct ble_gatt_access_ctxt *ctxt, void *arg)
{
int i = 0;
struct os_mbuf *om = ctxt->om;
switch (ctxt->op) {
case BLE_GATT_ACCESS_OP_WRITE_CHR:
while(om) {
if(g_ble_uart_output_fptr)
{
g_ble_uart_output_fptr((uint8_t *)om->om_data, om->om_len);
}else
{
//print_bytes(om->om_data, om->om_len);
//add by zxx start
if(om->om_len > 200)
{
printf("ble om->om_len is too long:%d return 0 please check send data length...\r\n",om->om_len);
return 0;
}
ble_data[0] = om->om_len;
//將數據轉存到buff中,ble_data[0]是數據的長度,長度必須小於255-1,否者下列循環會出問題。
for (u8 i = 0; i < om->om_len; i++) {
ble_data[i+1] = om->om_data[i];
}
if(om->om_len>0)
{
tls_os_queue_send(ble_q,ble_data, 0);
}
//add by zxx end
}
om = SLIST_NEXT(om, om_next);
}
return 0;
default:
assert(0);
return BLE_ATT_ERR_UNLIKELY;
}
}
^^^^打開 wm_ble_server_api_demo.h文件,做如下修改:
//add by zxx start
extern tls_os_queue_t *ble_q;
//add by zxx end
5、添加頭文件
在 wm_include.h文件中添加如下頭文件:
#include "wm_bt_app.h"
#include "wm_ble_server_api_demo.h"
6、編譯工程並下載到開發板。
1、下載助手
^^^^手機下載藍牙調試助手,(不一定是我這款)
2、連接app
^^^^打開並連接到WM-XX:XX:XX的藍牙上。第一次使用需要打開配置如下所示:
必須進行如下配置:==TX選擇xxxxf1,RX選擇xxxxf2==,否者無法正常接收數據。
3、測試
^^^^正常連接後,電腦端的串口助手會顯示如下:
^^^^發送消息:==<-00 01 00==,可以看到正常收到開發板返回的消息:->00 01 00
手機顯示如下:
串口助手顯示如下:
開發板狀態如下:
4、寫在後面
多說一句,這個app還是很不錯的,有界面可以控制發送不同指令:
設定每一個按鈕過後,可以直接點擊發送,方便快捷,最上方可以顯示收到的數據。
本次測試僅供參考:
參考文章:link