CI14LP串口协议V2¶
1、协议简介¶
2代串口协议(UART_PROTOCOL_VER = 2)为变长帧协议,支持命令(上行0xA0/下行0xA1)、ACK回复(0xA2)、事件通知(0xA3)四种协议类型,功能覆盖语音识别结果上报、提示音播放控制、版本查询、模块配置等场景。协议由 components\msg_com\voice_module_uart_protocol_g2.c 实现。
协议参数:
- 当前协议版本:V1.0.0(
VMUP_PROTOCOL_VERSION= 1) - 帧头:0xA5 0xFC(小端:低字节0xA5在前)
- 帧尾:0xFB
- 校验:发送时自动追加2字节校验和
- 数据区最大长度:
VMUP_MSG_DATA_MAX_SIZE(默认20字节,可配置)
2、帧格式¶
com_msg_data_t 结构(#pragma pack(1)):
| 字节序 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0~1 | header | uint16_t | 协议头,0xFCA5(小端发送A5 FC) |
| 2~3 | data_length | uint16_t | 数据长度 |
| 4 | msg_type | uint8_t | 协议类型 |
| 5 | msg_cmd | uint8_t | 协议命令 |
| 6 | msg_seq | uint8_t | 协议序列号 |
| 7~ | msg_data[] | uint8_t[] | 协议数据(最大20字节) |
| 追加 | chksum | uint16_t | 校验和(发送时自动添加) |
| 追加 | tail | uint8_t | 帧尾0xFB(发送时自动添加) |
3、协议类型与命令¶
3.1 协议类型(msg_type)¶
| 类型 | 值 | 说明 |
|---|---|---|
| VMUP_MSG_TYPE_CMD_UP | 0xA0 | 命令类型(上行) |
| VMUP_MSG_TYPE_CMD_DOWN | 0xA1 | 命令类型(下行) |
| VMUP_MSG_TYPE_ACK | 0xA2 | ACK回复类型 |
| VMUP_MSG_TYPE_NOTIFY | 0xA3 | 事件通知类型 |
3.2 协议命令(msg_cmd)¶
| 命令 | 值 | 说明 |
|---|---|---|
| VMUP_MSG_CMD_ASR_RESULT | 0x91 | 报告语音识别结果 |
| VMUP_MSG_CMD_PLAY_VOICE | 0x92 | 播放本地播报音 |
| VMUP_MSG_CMD_GET_FLASHUID | 0x93 | 读取FLASH的unique id序列号 |
| VMUP_MSG_CMD_GET_VERSION | 0x94 | 读取协议版本/SDK版本/ASR版本/播放器版本/应用版本 |
| VMUP_MSG_CMD_RESET_MODULE | 0x95 | 复位语音模块 |
| VMUP_MSG_CMD_SET_CONFIG | 0x96 | 设置音量、进入唤醒、语音开关 |
| VMUP_MSG_CMD_NOTIFY_STATUS | 0x9A | 事件通知 |
| VMUP_MSG_CMD_ACK_COMMON | 0xAA | 错误ACK |
3.3 播放类数据字节(msg_cmd=0x92,msg_data)¶
| 数据 | 值 | 说明 |
|---|---|---|
| VMUP_MSG_DATA_PLAY_START / PAUSE / RESUME / STOP | 0x80~0x83 | 播放开始/暂停/继续/停止 |
| VMUP_MSG_DATA_PLAY_BY_VOICEID | 0x90 | 通过音频ID播放提示音 |
| VMUP_MSG_DATA_PLAY_BY_SEMANTIC_ID | 0x91 | 通过语义ID播放提示音 |
| VMUP_MSG_DATA_PLAY_BY_CMD_ID | 0x92 | 通过命令词ID播放提示音 |
3.4 版本类数据字节(msg_cmd=0x94,msg_data)¶
| 数据 | 值 | 说明 |
|---|---|---|
| VMUP_MSG_DATA_VER_PROTOCOL / SDK / ASR / PREPROCESS / PLAYER | 0x80~0x84 | 协议/SDK/ASR/预处理算法/播放器版本号 |
| VMUP_MSG_DATA_VER_APP | 0x8A | 应用程序版本号 |
3.5 通知类数据字节(msg_cmd=0x9A,msg_data)¶
| 数据 | 值 | 说明 |
|---|---|---|
| VMUP_MSG_DATA_NOTIFY_POWERON | 0xB0 | 上电完成 |
| VMUP_MSG_DATA_NOTIFY_WAKEUPENTER / WAKEUPEXIT | 0xB1/0xB2 | 进入/退出唤醒状态 |
| VMUP_MSG_DATA_NOTIFY_PLAYSTART / PLAYEND | 0xB3/0xB4 | 开始播放/播放结束 |
| VMUP_MSG_DATA_NOTIFY_LOWPOWER_TO_NORMAL | 0xB5 | 低功耗启动完成 |
| VMUP_MSG_DATA_NOTIFY_NORMAL_TO_LOWPOWER | 0xB6 | 进入低功耗 |
3.6 设置类数据字节(msg_cmd=0x96,msg_data)¶
| 数据 | 值 | 说明 |
|---|---|---|
| VMUP_MSG_CMD_SET_VOLUME | 0x80 | 设置音量 |
| VMUP_MSG_CMD_SET_ENTERWAKEUP | 0x81 | 设置进入唤醒状态 |
| VMUP_MSG_CMD_SET_MUTE | 0x83 | 设置语音开关 |
3.7 ACK错误码¶
| 错误码 | 值 | 说明 |
|---|---|---|
| VMUP_MSG_ACK_ERR_NONE | 0x0 | 功能正确 |
| VMUP_MSG_ACK_ERR_NOSUPPORT | 0xFE | 不支持的功能 |
4、示例¶
1) 主控下发”通过命令词ID播放提示音”(ID=10):
帧数据:A5 FC 06 00 A1 92 01 92 0A 00 [chksum_l chksum_h] FB
字段解析:header=0xFCA5, data_length=6, msg_type=0xA1(下行命令),
msg_cmd=0x92(播放提示音), msg_seq=0x01,
msg_data[0]=0x92(通过命令词ID播放), msg_data[1..2]=0x0A(命令词ID)
2) 模块上报识别结果(命令词ID=10,识别得分80):
帧数据:A5 FC 06 00 A0 91 01 0A 50 00 [chksum_l chksum_h] FB
字段解析:msg_type=0xA0(上行命令), msg_cmd=0x91(识别结果),
msg_data[0..1]=命令词ID, msg_data[2]=识别得分
3) SDK内部接口调用(应用层扩展通知):
#include "voice_module_uart_protocol_g2.h"
//发送事件通知(如自定义通知事件)
vmup_send_notify(VMUP_MSG_DATA_NOTIFY_WAKEUPENTER);
4) 串口中断接收解析(SDK内部流程):
//UART接收中断中调用,逐字节解析
void UART1_IRQHandler(void)
{
if (uart_mask_irq_state(UART1, UART_RX_IRQ))
{
unsigned char rxdata = uart_rx_byte(UART1);
vmup_receive_packet(rxdata);
uart_clear_irq(UART1, UART_RX_IRQ);
}
}
5、其它¶
- 协议初始化:SDK上电流程中调用
vmup_communicate_init()(含协议串口初始化),波特率由user_config.h的UART_PROTOCOL_BAUDRATE配置。 - 用户自定义命令请从
VMUP_MSG_CMD_USER_START(0xB0)开始扩展。 - 通知类事件(进入唤醒、播放结束等)是否上报可在SDK配置中裁剪,减少串口流量。
6、API 参考¶
本协议实现位于 components\msg_com\voice_module_uart_protocol_g2.c,接口声明于 components\msg_com\voice_module_uart_protocol_g2.h。