蓝牙耳机BES2300P通过盒子获取/修改耳机状态信息
生活随笔
收集整理的這篇文章主要介紹了
蓝牙耳机BES2300P通过盒子获取/修改耳机状态信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求:生產過程中需要對不同版本的耳機編號,修改部分參數,查詢相關信息。
這需要用盒子轉發耳機串口的信息(你不能每個耳機都飛線,用盒子是最好的),對于信息還需要自定義一份協議,同時耳機程序對收發的數據做出反應。
如何接收數據:
數據幀
typedef struct {uint8_t frame_head;uint8_t cmd;uint8_t data_len; uint8_t *p_data;uint16_t crc16; } box_frame;//收到的數據自定義協議表示左右耳收發
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取數據,分析數據頭區分左右耳,核算CRC,然后轉發給box_cmd_find_manage_handle去執行操作
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;}//都是根據協議來的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;}//進入執行模塊if(box_cmd_find_manage_handle(frame_data.cmd, frame_data.p_data, frame_data.data_len) == 0)return;}收到之后的執行和回復:
類型包含 指令類型 對應處理函數(數據,長度)
typedef struct {box_num cmd;//枚舉值說明指令含義int32_t (* cmd_handler)(uint8_t *cmd_data, uint16_t data_len);//指針函數cmd_handler,他有兩個參數cmd_data,和data_len} box_cmd_config;枚舉值
typedef enum { BOX_CMD_TWS_REBOOT = 0x01, BOX_CMD_GET_VERSION } box_num ;有了該box_cmd_config后直接整個數組,然后box_cmd_find_manage_handle找到對應的執行函數。
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 和處理函數連接在一起
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; }處理函數很簡單,判斷一下收到的數據對不對,然后執行指令執行代碼,查詢指令使用api回復相應的值就可以了,舉例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));//發送apiosDelay(20);pmu_reboot();} }回復數據send_buf 長度和回什么完全可以自己定義,以上查詢到回復流程結束。
以后需要添加新的指令只需要增加枚舉值,box_cmd_cfg 中注冊,定義一個處理函數即可,可以避免擴展的麻煩了。
總結
以上是生活随笔為你收集整理的蓝牙耳机BES2300P通过盒子获取/修改耳机状态信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝打标API,旺旺打标签接口文档
- 下一篇: 大数据面试题(一):HDFS核心高频面试