当前位置: 首页 > news >正文

山景BP1048增加AT指令,实现单片机串口控制播放音乐(一)

   1、设计目的 

山景提供的SDK是蓝牙音箱demo,用户使用ADC按键或者IR遥控器,进行人机交互。然而现实很多场景,需要和单片机通信,不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示为控制指令。

设计AT指令集

指令功能
AT+CA指定音量
AT+CB播放和暂停
AT+CC下一曲
AT+CD上一曲
AT+CE音量+
AT+CF音量-
AT+CG蓝牙是否开启后台
AT+CJ单曲播放 循环顺序播放
AT+CK蓝牙自动后台
AT+CN提示音
AT+CP此指令是设置上电自动进入模式
AT+CQEQ 设置
AT+CR设置自动回传功能
AT+CT设置波特率
AT+CM切换模式
AT+CU静音
AT+CZ芯片复位
AT+AA播放模式
AT+AC指定播放模式
AT+BA接挂电话控制指令

 返回消息包括

M1+0000000E当前设备播放的文件为0x0E
M2+0000000F当前设备的文件总数是0x0F,注意是合法的音频文件
MT+0000001E当前文件的总时间为0x1E 秒
MK+00000004当前文件已经播放到了0x04秒
MF+XXXXXXX当前播放的文件的名称是xxxxxx。这里文件名是完整的

 上述指令基本能覆盖大部分需求。

2、移植AT指令引擎

a、在SDK中添加AT组件

b、在RTOS系统中添加一个AT处理任务服务

 at_task程序如下所示


#include <string.h>
#include "type.h"
#include "app_config.h"
#include "rtos_api.h"
#include "app_message.h"
#include "debug.h"
#include "at_task.h"
#include "uarts.h"
#include "uarts_interface.h"
#include "AT_command.h"
#include "irqn.h"
#include "task.h"
#include "timers.h"
#include "FreeRTOS.h"
#include "timer.h"
#include "timeout.h"
#include "mode_task.h"
#include "bt_play_mode.h"#define AT_APP_TASK_STACK_SIZE 1024 // 512//1024#define AT_APP_TASK_PRIO 3TIMER TimerOut; //
xTaskHandle taskAtHandle;static uint8_t timeLockFlag = 0;ATAppContext AtAppCt;#define UART_RX_LEN 256
#define UART_TX_LEN 300/**\brief*/
typedef struct
{uint8_t buff[UART_RX_LEN];uint16_t lenth;uint8_t flag;uint8_t busy;uint8_t u8RxCnt;
} UART_STRUCT;static UART_STRUCT AtRxBuf;uint8_t AtTxBuff[UART_TX_LEN] = {0};static void AtAppInit(void);static void AtTaskEntrance(void *param)
{MessageContext msg;while (1){MessageRecv(AtAppCt.msgHandle, &msg, AT_APP_MSG_TIMEOUT);if(msg.msgId != MSG_NONE){switch(msg.msgId){case MSG_AT_UDISK_SONG_ALL_MSG:{AT_PPRINTF("\n");sprintf( AtTxBuff, "M1+%08X\r\n",AtAppCt.gMediaPlayer->CurFileIndex );		//当前索引AT_PPRINTF(AtTxBuff);vTaskDelay(1);sprintf( AtTxBuff, "M2+%08X\r\n",AtAppCt.gMediaPlayer->TotalFileSumInDisk );		//当前设备文件总数AT_PPRINTF(AtTxBuff);vTaskDelay(1);sprintf( AtTxBuff, "MK+%08X\r\n",AtAppCt.gMediaPlayer->CurPlayTime );			//当前播放时间AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, "MF+%s\r\n",AtAppCt.gMediaPlayer->file_longname );			//当前播放时间AT_PPRINTF(AtTxBuff);}break;case MSG_AT_UDISK_SONG_SIGNAL_MSG:{AT_PPRINTF("\n");sprintf( AtTxBuff, "M1+%08X\r\n",AtAppCt.gMediaPlayer->CurFileIndex );		//当前索引AT_PPRINTF(AtTxBuff);vTaskDelay(1);sprintf( AtTxBuff, "M2+%08X\r\n",AtAppCt.gMediaPlayer->TotalFileSumInDisk );		//当前设备文件总数AT_PPRINTF(AtTxBuff);vTaskDelay(1);sprintf( AtTxBuff, "MK+%08X\r\n",AtAppCt.gMediaPlayer->CurPlayTime );			//当前播放时间AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, "MF+%s\r\n",AtAppCt.gMediaPlayer->file_longname );			//当前播放时间AT_PPRINTF(AtTxBuff);}break;case MSG_AT_MODE_CON_BTAUDIO_IDEL_MSG:		//蓝牙空闲模式{AT_PPRINTF("\n");sprintf( AtTxBuff, "TS+01\r\n");		//蓝牙模式AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, "QM+01\r\n");		//蓝牙模式AT_PPRINTF(AtTxBuff);}break;case MSG_AT_MODE_CON_BTAUDIO_PLAYING_MSG:    //蓝牙模式{AT_PPRINTF("\n");sprintf( AtTxBuff, "TS+02\r\n");		//蓝牙播放音乐AT_PPRINTF(AtTxBuff);SysModeEnter(ModeBtAudioPlay);}break;case MSG_AT_MODE_CON_BTAUDIO_SUSPEND_MSG:    //挂起蓝牙{AT_PPRINTF("\n");sprintf( AtTxBuff, "TS+01\r\n");		//蓝牙模式AT_PPRINTF(AtTxBuff);}break;case MSG_AT_MODE_CON_UDISK_MSG:		//U盘模式{AT_PPRINTF("\n");sprintf( AtTxBuff, "MU+01\r\n");		//U盘插入AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, "QM+02\r\n");		//U盘模式AT_PPRINTF(AtTxBuff);AtStackServiceMsgSend(MSG_AT_UDISK_SONG_SIGNAL_MSG);//发送切换歌曲指令}break;case MSG_AT_MODE_CON_UDISK_OUT_MSG:		//拔出U盘{AT_PPRINTF("\n");sprintf( AtTxBuff, "MU+02\r\n");		//U盘拔出AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, "QM+01\r\n");		//蓝牙模式AT_PPRINTF(AtTxBuff);SysModeEnter(ModeBtAudioPlay);}break;case MSG_AT_MODE_CON_AUX_MSG:		//AUX模式{AT_PPRINTF("\n");sprintf( AtTxBuff, "QM+05\r\n");		//U盘模式AT_PPRINTF(AtTxBuff);SysModeEnter(ModeLineAudioPlay);}break;case MSG_AT_MODE_CON_IDEL_MSG:		//空闲模式{AT_PPRINTF("\n");sprintf( AtTxBuff, "QM+00\r\n");		//U盘模式AT_PPRINTF(AtTxBuff);}break;}}if (timeLockFlag == 0 && IsTimeOut(&TimerOut)){timeLockFlag = 1;AtRxBuf.buff[AtRxBuf.u8RxCnt] = 0;AT_CMD_Process(AtRxBuf.buff, AtRxBuf.u8RxCnt);AtRxBuf.u8RxCnt = 0;}}
}static void AtUartReceive(void)
{AT_CMD_Process(AtRxBuf.buff, AtRxBuf.u8RxCnt);
}/***************************************************************************************** APIs**/
int32_t AtAppTaskStart(void)
{AtAppInit();APP_DBG("AtTask  Create\n");TimeOutSet(&TimerOut, 20);xTaskCreate(AtTaskEntrance, "AtApp", AT_APP_TASK_STACK_SIZE, NULL, AT_APP_TASK_PRIO, &taskAtHandle);
}static void AtAppInit(void)
{memset(&AtAppCt, 0, sizeof(ATAppContext));AtAppCt.msgHandle = MessageRegister(AT_NUM_MESSAGE_QUEUE);
}void AtStackServiceMsgSend(uint16_t msgId)
{MessageContext		msgSend;msgSend.msgId = msgId;MessageSend(AtAppCt.msgHandle, &msgSend);}

 在主任务中启动at_task任务

3、运行调试

 可以看出AT指令任务已经运行。

http://www.lryc.cn/news/507869.html

相关文章:

  • SMMU软件指南SMMU编程之全局错误和最小配置
  • CPU条件下Pytorch、jupyter环境配置
  • 【自用】通信内网部署rzgxxt项目_01,后端pipeDemo部署(使用nssm.exe仿照nohup)
  • Ubuntu 安装实时内核指南
  • MySQL 主从复制与高可用
  • RCE总结
  • 基于UNITY3D的照片墙演示项目技术分享
  • 随手记:小程序兼容后台的wangEditor富文本配置链接
  • maven项目运行时NoSuchMethodError问题排查记录(依赖冲突解决)
  • ECharts关系图-关系图11,附视频讲解与代码下载
  • 【C语言】动态内存管理:详解malloc和free函数
  • EGO Swarm翻译
  • Linux根目录
  • SAP-SD-参照退货订单补货时带不出行项目
  • 12-C语言单向链表
  • 2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.2,RTP协议-RTP协议概述,协议详情
  • Linux系统编程——系统内核中的信号
  • delve调试环境搭建—golang
  • shell脚本的循环-----while和for循环
  • 【游戏设计原理】21 - 解谜游戏的设计
  • 【漏洞复现】Wordpress GutenKit 插件 远程文件写入致RCE漏洞复现(CVE-2024-9234)
  • 深度学习任务简介:分类、回归和生成
  • 【测试】Unittest
  • java 根据路径下载文件转换为MultipartFile,并且上传到服务器
  • Onvif服务端开发
  • 【jvm】主要参数
  • 【优选算法】—移动零(双指针算法)
  • PostgreSQL标识符长度限制不能超过63字节
  • 嵌入式硬件面试题