蓝牙耳机BES2300P通过盒子获取/修改耳机状态信息
需求:生產(chǎn)過程中需要對不同版本的耳機(jī)編號,修改部分參數(shù),查詢相關(guān)信息。
這需要用盒子轉(zhuǎn)發(fā)耳機(jī)串口的信息(你不能每個(gè)耳機(jī)都飛線,用盒子是最好的),對于信息還需要自定義一份協(xié)議,同時(shí)耳機(jī)程序?qū)κ瞻l(fā)的數(shù)據(jù)做出反應(yīng)。
如何接收數(shù)據(jù):
數(shù)據(jù)幀
typedef struct {uint8_t frame_head;uint8_t cmd;uint8_t data_len; uint8_t *p_data;uint16_t crc16; } box_frame;//收到的數(shù)據(jù)自定義協(xié)議表示左右耳收發(fā)
typedef enum {BOX_FRAME_HEAD_RX_L = 0x10,BOX_FRAME_HEAD_RX_R = 0x11,BOX_FRAME_HEAD_TX_L = 0x30,BOX_FRAME_HEAD_TX_R = 0x31, } box_frame_head;直接用api取數(shù)據(jù),分析數(shù)據(jù)頭區(qū)分左右耳,核算CRC,然后轉(zhuǎn)發(fā)給box_cmd_find_manage_handle去執(zhí)行操作
static void box_manage_analyze_recv_data{uint8_t *p_data;uint16_t data_len;hal_box_rx_get(p_data ,data_len );if(p_data == NULL) {X2BM_TRACE(0, "data == NULL");return;}if(data_len == 0) {X2BM_TRACE(0, "data_len == 0");return;}//都是根據(jù)協(xié)議來的head表示左右耳,cmd指令類型 box_frame_head frame_data;frame_data.frame_head = p_data[0];frame_data.cmd = p_data[1];frame_data.data_len = (p_data[2]&0xff);frame_data.p_data = &p_data[3];box_frame_head rx_head_flag = X2BM_FRAME_HEAD_RX_L;if(app_tws_get_earside() == RIGHT_SIDE) {rx_head_flag= BOX_FRAME_HEAD_RX_R;}if(box_frame_head.frame_head != rx_head_flag) {//可加日志打印return;}if(box_frame_head.data_len!= data_len) {//可加日志打印return;}//進(jìn)入執(zhí)行模塊if(box_cmd_find_manage_handle(frame_data.cmd, frame_data.p_data, frame_data.data_len) == 0)return;}收到之后的執(zhí)行和回復(fù):
類型包含 指令類型 對應(yīng)處理函數(shù)(數(shù)據(jù),長度)
typedef struct {box_num cmd;//枚舉值說明指令含義int32_t (* cmd_handler)(uint8_t *cmd_data, uint16_t data_len);//指針函數(shù)cmd_handler,他有兩個(gè)參數(shù)cmd_data,和data_len} box_cmd_config;枚舉值
typedef enum { BOX_CMD_TWS_REBOOT = 0x01, BOX_CMD_GET_VERSION } box_num ;有了該box_cmd_config后直接整個(gè)數(shù)組,然后box_cmd_find_manage_handle找到對應(yīng)的執(zhí)行函數(shù)。
static const box_cmd_config box_cmd_cfg[] = {{BOX_CMD_TWS_REBOOT , box_cmd_tws_reboot_handler},BOX_CMD_GET_VERSION, box_cmd_get_version},};box_cmd_find_manage_handle 真正將box_num 和處理函數(shù)連接在一起
int32_t box_cmd_find_manage_handle(uint8_t cmd, uint8_t *cmd_data, uint8_t data_len){box_num b_cmd = (box_num )cmd;for(uint16_t i = 0; i < sizeof(box_num ) / sizeof(box_num [0]); i++) {if(b_cmd == box_num [i].cmd) {if(box_num [i].cmd_handler != NULL) {box_num [i].cmd_handler(cmd_data, data_len);return 0;} else {TRACE("ERROR,the handler of the cmd is NULL");return 1;}}}TRACE("ERROR,NO found the cmd");return 2; }處理函數(shù)很簡單,判斷一下收到的數(shù)據(jù)對不對,然后執(zhí)行指令執(zhí)行代碼,查詢指令使用api回復(fù)相應(yīng)的值就可以了,舉例box_cmd_tws_switch_handler。
static int32_t box_cmd_tws_reboot_handler(uint8_t *cmd_data, uint16_t data_len){uint8_t send_buf[6] = {0};if (NULL == cmd_data && data_len < 6) {send_buf[0] = 0xFF;box_manage_send_data(BOX_CMD_TWS_REBOOT,send_buf,sizeof(send_buf));TRACE("ERROR,LOST DATA");}if(cmd_data[1] == 1){send_buf[0] = 0x01;box_manage_send_data(BOX_CMD_TWS_REBOOT,send_buf,sizeof(send_buf));//發(fā)送apiosDelay(20);pmu_reboot();} }回復(fù)數(shù)據(jù)send_buf 長度和回什么完全可以自己定義,以上查詢到回復(fù)流程結(jié)束。
以后需要添加新的指令只需要增加枚舉值,box_cmd_cfg 中注冊,定義一個(gè)處理函數(shù)即可,可以避免擴(kuò)展的麻煩了。
總結(jié)
以上是生活随笔為你收集整理的蓝牙耳机BES2300P通过盒子获取/修改耳机状态信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝打标API,旺旺打标签接口文档
- 下一篇: 大数据面试题(一):HDFS核心高频面试