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

news2024/12/26 17:51:52

   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 3

TIMER 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.coloradmin.cn/o/2265952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IntelliJ IDEA Docker集成

一、概述 Docker是一种用于在隔离和可复制环境中部署和运行可执行文件的工具。这可能很有用&#xff0c;例如&#xff0c;在与生产相同的环境中测试代码。 IntelliJ IDEA集成了Docker功能&#xff0c;并为创建Docker映像、运行Docker容器、管理Docker Compose应用程序、使用公…

43. Three.js案例-绘制100个立方体

43. Three.js案例-绘制100个立方体 实现效果 知识点 WebGLRenderer&#xff08;WebGL渲染器&#xff09; WebGLRenderer是Three.js中最常用的渲染器之一&#xff0c;用于将3D场景渲染到网页上。 构造器 WebGLRenderer(parameters : Object) 参数类型描述parametersObject…

Linux------进程处理(system库函数)

视频&#xff1a; 【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p34&vd_source342079de7c07f82982956aad8662b467 #include <stdlib.h> #include <…

自然语言处理与知识图谱的融合与应用

目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…

【数据库初阶】数据库基础知识

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们&#xff0c;大家好&#xff01;在这篇文章中&#xff0c;我们将深入浅出地为大家讲解 数据库…

【LeetCode】726、原子的数量

【LeetCode】726、原子的数量 文章目录 一、递归: 嵌套类问题1.1 递归: 嵌套类问题 二、多语言解法 一、递归: 嵌套类问题 1.1 递归: 嵌套类问题 遇到 ( 括号, 则递归计算子问题 遇到大写字母, 或遇到 ( 括号, 则清算历史, 并开始新的记录 记录由两部分组成: 大写字母开头的 …

财经英语期末考试复习

文章目录 第一篇第二篇第三篇第四篇思路梳理作文撰写 第一篇 李宁是中国运动服装和鞋类行业的领导者,这源于其创始人,同名体操冠军李宁的愿景. Ling-Ning is the Chinese leader in athletic apparel and footwear, rooted in the vision of its founder and namesake,the cha…

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VA-I-FGSM介绍相关定义算法流程 VAI-FGSM代码实现VAI-FGSM算法实现攻击效果 代码汇总vaifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对…

20241225在ubuntu20.04.5下监控SSD

20241225在ubuntu20.04.5下监控SSD 2024/12/25 20:29 参考资料&#xff1a; 百度&#xff1a;ubuntu查看ssd寿命 方法 1&#xff1a;使用「磁盘」工具监测 SSD 健康状态 sudo apt install gnome-disk-utility 方法 2&#xff1a;使用 smartctl 工具检查 SSD 健康状态 Ubuntu 和…

mvn install:install-file jar 打入本地仓库

安装指定文件到本地仓库命令&#xff1a;mvn http://install:install-file -DgroupId : 设置上传到仓库的包名 -DartifactId : 设置该包所属的模块名 -Dversion1.0.0 : 设置该包的版本号 -Dpackagingjar : 设置该包的类型(很显然jar包) -Dfile : 设置该jar包文件所在的路径…

CentOS下,离线安装vscode的步骤;

前置条件&#xff1a; 1.CentOS7; 步骤&#xff1a; 1.下载vscode指定版本&#xff0c;例如&#xff1b; 例如 code-1.83.1-1696982959.el7.x86_64.rpm 2.使用下面命令&#xff1a; sudo rpm -ivh code-1.83.1-1696982959.el7.x86_64.rpm 其他&#xff1a; 卸载vscode的命…

【CSS in Depth 2 精译_087】14.4:CSS 中的浮动特效以及在文字环绕中的应用 + 14.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 14 章 蒙版、形状与剪切】 ✔️ 14.1 滤镜 14.1.1 滤镜的类型14.1.2 背景滤镜 14.2 蒙版 14.2.1 带渐变效果的蒙版特效14.2.2 基于亮度来定义蒙版14.2.3 其他蒙版属…

2025考研加油!Jing也加油哦!

一恍惚&#xff0c;离自己考研初试过去都两年了&#xff01;研究生生活也过去一大半&#xff01;借此机会也总结一下研究生这一段生活——研究生生活&#xff08;上&#xff09; About I 昨天实验室聚餐&#xff0c;作为老生欢迎新生&#xff0c;啊啊啊&#xff0c;真的没想到…

Flink调优----资源配置调优与状态及Checkpoint调优

目录 第 1 章 资源配置调优 1.1 内存设置 1.1.1 TaskManager 内存模型 1、内存模型详解 2、案例分析 1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源 1.2.1 使用 DefaultResourceCalculator 策略 1.2.2 使用 DominantResourceCalculator 策略 1.2.3 使用 DominantRes…

9. zynq应用开发--makefile编译

3. 使用SDK工具 如果只做 Linux 应用开发&#xff0c;只需要一个 sdk.sh 文件即可&#xff0c;可以脱离 Petalinux 和 Vitis&#xff0c;也可以编译其三方的应用&#xff0c;可以说一劳永逸。 配置根文件系统 petalinux-config -c rootfs 编译SDK petalinux-build --sdk Linu…

【ORB-SLAM3:相机针孔模型和相机K8模型】

在ORB-SLAM3中&#xff0c;相机的建模是 SLAM 系统的核心之一&#xff0c;因为它直接影响到如何处理和利用图像数据进行定位和地图构建。ORB-SLAM3 支持不同的相机模型&#xff0c;其中包括针孔模型和鱼眼模型&#xff08;K8 模型&#xff09;。下面分别介绍这两种模型。 相机…

element-plus在Vue3中开发相关知识

报错&#xff1a;error.mjs:20 ElementPlusError: [ElForm] model is required for resetFields to work. 原因&#xff1a;el-form使用v-model没有把内容绑定上&#xff0c;需要使用 :model 才可以校验 将&#xff1a; <el-form label-width"auto" class"…

HarmonyOS NEXT 实战之元服务:静态案例效果--- 日出日落

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 出现错误的情况 报错&#xff1a; 代码&#xff1a; 报错截图 原因分析 解决方案 方法一 方法二 出现错误的情况 以下是我遇到该错误时遇到的报错和代码&…

基础运维学习计划-base版

目录 需要学习的内容&#xff1f; liunx基础 sql/mysql基础 tcp/ip协议基础 http基础 dns基础 网络基础&#xff1a;交换&路由概念&原理 常见网络协议 月学习计划 12.26 日 &#xff08;bilibili自己找视频看看&#xff0c;资源很多&#xff09; 12.27日 1…