网站页面组成部分,做网站网页需要学些什么,石家庄青园网站建设,单位门户网站建设1、设计目的
山景提供的SDK是蓝牙音箱demo#xff0c;用户使用ADC按键或者IR遥控器#xff0c;进行人机交互。然而现实很多场景#xff0c;需要和单片机通信#xff0c;不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示… 1、设计目的
山景提供的SDK是蓝牙音箱demo用户使用ADC按键或者IR遥控器进行人机交互。然而现实很多场景需要和单片机通信不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示为控制指令。
设计AT指令集
指令功能ATCA指定音量ATCB播放和暂停ATCC下一曲ATCD上一曲ATCE音量ATCF音量-ATCG蓝牙是否开启后台ATCJ单曲播放 循环顺序播放ATCK蓝牙自动后台ATCN提示音ATCP此指令是设置上电自动进入模式ATCQEQ 设置ATCR设置自动回传功能ATCT设置波特率ATCM切换模式ATCU静音ATCZ芯片复位ATAA播放模式ATAC指定播放模式ATBA接挂电话控制指令 返回消息包括
M10000000E当前设备播放的文件为0x0EM20000000F当前设备的文件总数是0x0F注意是合法的音频文件MT0000001E当前文件的总时间为0x1E 秒MK00000004当前文件已经播放到了0x04秒MFXXXXXXX当前播放的文件的名称是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, TS01\r\n); //蓝牙模式AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, QM01\r\n); //蓝牙模式AT_PPRINTF(AtTxBuff);}break;case MSG_AT_MODE_CON_BTAUDIO_PLAYING_MSG: //蓝牙模式{AT_PPRINTF(\n);sprintf( AtTxBuff, TS02\r\n); //蓝牙播放音乐AT_PPRINTF(AtTxBuff);SysModeEnter(ModeBtAudioPlay);}break;case MSG_AT_MODE_CON_BTAUDIO_SUSPEND_MSG: //挂起蓝牙{AT_PPRINTF(\n);sprintf( AtTxBuff, TS01\r\n); //蓝牙模式AT_PPRINTF(AtTxBuff);}break;case MSG_AT_MODE_CON_UDISK_MSG: //U盘模式{AT_PPRINTF(\n);sprintf( AtTxBuff, MU01\r\n); //U盘插入AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, QM02\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, MU02\r\n); //U盘拔出AT_PPRINTF(AtTxBuff);sprintf( AtTxBuff, QM01\r\n); //蓝牙模式AT_PPRINTF(AtTxBuff);SysModeEnter(ModeBtAudioPlay);}break;case MSG_AT_MODE_CON_AUX_MSG: //AUX模式{AT_PPRINTF(\n);sprintf( AtTxBuff, QM05\r\n); //U盘模式AT_PPRINTF(AtTxBuff);SysModeEnter(ModeLineAudioPlay);}break;case MSG_AT_MODE_CON_IDEL_MSG: //空闲模式{AT_PPRINTF(\n);sprintf( AtTxBuff, QM00\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指令任务已经运行。