一.方案背景描述
随着科技的飞速发展,人工智能和语音识别技术在各个领域都得到了广泛应用。其中,文本转语音(TTS)技术以其独特的优势,在收款机语音播报收银领域发挥着越来越重要的作用。本文将深入探讨TTS技术在收款机播报收银中的具体应用,包括技术概述、播报需求、应用优势、内容定制、用户体验提升以及未来的发展趋势与展望。
1.TTS技术概述
TTS,即文本转语音技术,是一种能够将计算机中的文本信息转化为可听懂的语音输出的技术。它基于先进的语音合成算法,结合自然语言处理技术和语音学知识,能够生成流畅自然的语音。在收款机播报收银中,TTS技术能够将交易信息实时转化为语音,方便顾客了解交易详情。
2.收款机播报需求
在商场、超市等零售场所,收款机播报收银的需求日益凸显。通过语音播报,顾客可以无需查看屏幕即可了解交易金额、找零等信息,大大提高了购物体验和效率。同时,对于视力不佳或不便查看屏幕的顾客来说,语音播报更是提供了极大的便利。
3.TTS应用优势
TTS技术在收款机播报收银中的应用具有以下优势:首先,实时性强,能够实时将交易信息转化为语音输出;其次,准确度高,能够确保播报内容的准确性;再次,灵活性好,可以根据实际需求定制播报内容;最后,用户体验佳,通过语音播报提高了顾客购物的便捷性和舒适性。
4.播报内容定制
在TTS应用中,播报内容的定制是关键一环。收款机可以根据实际需求和场景设置不同的播报内容,包括交易金额、支付方式、找零情况、优惠信息等。同时,还可以根据顾客的偏好和需求进行个性化定制,提高播报内容的针对性和实用性。
5.用户体验提升
通过应用TTS技术,收款机播报收银可以显著提升用户体验。顾客在购物过程中无需分心查看屏幕或询问收银员,就能获取到完整的交易信息。此外,语音播报还可以配合其他交互方式,如语音识别、触摸屏等,提供更加便捷、智能的购物体验。
TTS(Text To Speech,从文本到语音)技术作为人机对话的一部分,近年来随着人工智能的发展得到了显著的进步。TTS技术的应用范围广泛,包括电子邮件的阅读、IVR系统的语音提示等,并在各个行业中发挥着重要作用。关于TTS技术的发展前景,有以下几个方面的趋势:
更高的自然度和真实感:随着深度学习和神经网络技术的不断进步,TTS系统能够学习自然语言中的各种声音和音调,生成的语音将更接近人类的语音特征,从而提高语音的自然度和真实感。
个性化定制:TTS系统有望通过学习用户的语音、音调、口音等特征,生成更符合用户需求的语音。这将使得语音合成技术更加贴近用户的个性化需求,从而提高用户体验。
多语言支持:随着跨语言翻译和多语言交流的需求不断增加,TTS系统将需要支持更多的语言和口音。这将推动TTS技术在多语言场景下的应用和发展。
多样化的语音风格和情感表达:TTS系统将进一步提供多样化的语音风格和情感表达能力。用户可以根据个人喜好和需求选择不同的语音风格,如年龄、性别、口音等。
广泛的应用领域:除了传统的应用领域,TTS技术还将进一步应用于虚拟人物、机器人等场景中,为这些领域带来更加真实的语音交互体验。
综上所述,TTS技术的发展前景十分广阔,未来将在提高语音质量和自然度、个性化定制、多语言支持以及多样化应用等方面取得更多的突破和创新。这将为用户带来更加便捷、高效和真实的语音交互体验,推动人机交互技术的发展。
综上所述,TTS技术在收款机播报收银中具有重要的应用价值和发展前景。通过不断优化和完善技术,我们可以期待它在未来为零售行业带来更多的创新和变革。本方案采用WT3000T芯片增加语音功能。不但可用耳朵听语音播报收款的情况等(依用户需求设置),而且可以播放音乐或英语口语美文。解决了在不同播报要求下语音占用大量资源空间的问题。可以实现低成本低功耗的文本转语音,支持中英文两种功能,实现播报语音自由配置无需通过升级方式替换语音,给方案商提供性价比非常高的解决方案。
WT3000T8是一款功能强大的高品质语音芯片,采用了高性能32位处理器、最高频率可达240MHz。WT3000T8高集成度的语音合成芯片,可实现中文、英文字母语音合成;并集成了语音编码、解码功能,可支持用户进行语音合成和语音播放,具有低成本、低功耗、高可靠性、通用性强等特点,现有WT3000T8-32N QFN32(体积小4*4MM)的封装芯片。带有地址播放、插播、单曲循环、所有曲目循环、随机播放等功能。31级音量可调、最大可以支持外挂128Mbit的Flash。
深圳唯创知音电子有限公司,位于广东省深圳市宝安区,1999年成立于广州。历经20多年的发展,公司已成为集研发、生产、销售和服务于一体的,专注于语音技术研究、语音产品方案设计及控制等软、硬件设计的国家高新技术企业。在北京、广州、武汉、上海等地拥有多家子公司,构筑了面向全国的经营和服务网络,涵盖家电、医疗器械、安防报警、汽车电子、多媒体、通信、电话录音、工业自动化控制、玩具及互动消费类产品等领域,公司的集成芯片和模块主要有:播放类、录音类、MP3类、蓝牙WiFi类、语音识别类。唯创知音已经形成标准的品质保障流程和高效的服务体系。芯片资料可向公司官网或客服索取相关资料,如果有订制需求,也可向客服咨询,可提供更多的技术服务。
公司成品线主要产品涵盖有工地安全、电梯安全(语音广告)、森林防火安全提示、垃圾分类提示、娱乐、店铺迎宾等业务领域,涉及政府、工业、文教、交通、能源和企业等行业应用。
二.方案系统组成
2.1系统主要功能
Ø 上电默认不播放;具备BUSY状态指示,上电默认BUSY播放时为低电平,不播放时为高电平(可发码修改默认配置);
Ø 音频输出方式,样品默认DAC输出;
Ø 支持语音高品质音频格式,(8kbps~320kbps)声音优美,.MP3、.WAV格式;
Ø 支持指令随机播放,无缝循环播放功能等;
Ø 最大可以支持128Mbit的Flash;
Ø 音量可调,音量等级31级;
Ø 大功率IO驱动能力,最高可直接驱动32mA;
Ø 支持任意中文文本、英文字母的合成,并且支持中文与英文字母混读,英文字母暂不支持使用标记实现变速变调;
芯片支持任意中文、英文字母的合成,可以采用GB 2312编码方式。每次合成的文本量最多可达2K字节。
芯片对文本进行分析,对常见的数字、号码、时间、日期、度量衡符号等格式的文本,芯片能够根据内置的文本匹配规则进行正确的识别和处理。
Ø 支持多种控制命令
如合成文本、停止合成、暂停合成、恢复合成、状态查询、进入休眠模式、唤醒等。 控制器通过通讯接口发送控制命令可以对芯片进行相应的控制。芯片的控制命令非常简单易用,例如:芯片可通过参考对应的指令说明即可实现播放提示音和中文文本合播放成,还可以通过标记文本实现对合成的参数设置。
Ø 支持多种方式查询芯片的工作状态
包括:查询状态管脚电平、通过读芯片自动返回的工作状态字、发送查询命令获得芯片工作状态的回传数据。
Ø 单芯片使用(使用内置容量)时内置语音需出厂前写入。
2.2系统结构框图
2.3主要芯片介绍
程序及模块选型简介
系列 | 功能代码 | 通信方式 | 模块选型 | 音频输出 | 功能说明 |
WT3000T系列 | T001 | UART(9600) | M01 | DAC | 仅支持内置Flash播放,可存放30秒固定语音 |
2.4 引脚描述
芯片封装管脚图
PIN-NO. | 名称 | 功能说明 |
0 | GND | 芯片底部地(必须接地) |
1 | VMID | 连接一个1uF外部电容到地 |
2 | DACL | DAC左声道音频输出 |
3 | DACR | DAC右声道音频输出 |
4 | NC | 保留此引脚悬空 |
5 | P27 | IO口 |
6 | P26 | IO口 |
7 | P25 | IO口 |
8 | P24 | IO口 |
9 | P21 | IO口 |
10 | VCC | 电源输入 |
11 | VREG | 接一个1uF电容到地 |
12 | P19 | IO口 |
13 | P18 | IO口 |
14 | P17 | IO口 |
15 | P16 | IO口 |
16 | VCM | 参考电压输出,接一个0.1uF外部电容到地 |
17 | XIN | 无 |
18 | XOUT | 无 |
19 | P37/SPI_DO | SPI Flash数据输出 |
20 | P36/SPI_CLK | SPI Flash时钟 |
21 | P35/SPI_DI | SPI Flash数据输入 |
22 | P34/SPI_CS | SPI Flash片选 |
23 | ICEDAT/RX1 | UART_RX,语音芯片数据接收 |
24 | ICECLK/TX1 | UART_TX,语音芯片数据发送 |
25 | UART_RX | IO口 |
26 | UART_TX | IO口 |
27 | P01 | Busy显示 |
28 | P00 | IO口 |
29 | P39 | IO口 |
30 | NC | 保留此引脚悬空 |
31 | VOUT | 芯片内部IO电源3.3V输出,必须接106电容到地 |
32 | AGND | 模拟地 |
2.5 WT3000T M01模块
管脚描述
接口 | 名称 | 功能说明 |
1 | 5V | 电源输入(2.6-5V) |
2 | GND | 电源地 |
3 | TX | UART_TX,通信端口 |
4 | RX | UART_RX,通信端口 |
5 | MIC+ | 未启用 |
6 | MIC- | 未启用 |
7 | SPK- | 模块内部功放左声道输出 |
8 | SPK+ | 模块内部功放右声道输出 |
注:MIC接口、天线、晶振部分为兼容其他型号及后续产品迭代升级预留使用,使用TTS功能时无需考虑这部分,使用串口、喇叭接口即可满足调试。
三、协议命令格式
芯片内置标准UART异步串口接口,默认波特率9600,属于3.3V TTL电平接口。通讯数据格式是:起始位:1位;数据位:8位;奇偶位:无;停止位:1位。使用电脑串口调试助手,需要正确设置串口的参数,设置如图:
指令发码格式
起始码 | 帧长度 | 流水号 | 应答标志 | 数据帧来源 | N个命令信息 | 累加和校验 | 结束码 |
7E | 见下文 | 见下文 | 见下文 | 见下文 | 见下文 | 见下文 | EF |
指令返回码格式
起始码 | 帧长度 | 流水号 | 应答标志 | 数据帧来源 | N个命令信息 | 累加和校验 | 结束码 |
7E | 见下文 | 见下文 | 见下文 | 见下文 | 见下文 | 见下文 | EF |
注:执行完每条写命令之后,按照通信协议格式返回该命令相对应的结果码。
帧长度:2字节,指帧长度+流水号+应答标志+数据帧来源+N个命令信息+累加和校验和的长度,帧长度高位在前低位在后;
流水号:1字节,每次一帧数据自动加1,避免接收重复的数据,相同流水号的数据为重复数据应做丢弃;
应答标志:1字节,固定填00;
数据帧来源:1字节,02为TTS芯片端,03为MCU芯片端;
N个命令信息:由N个命令信息组成,1个命令信息内容为2字节命令+1字节数据长度+N字节数据,单个命令信息最大支持255个字节数据,但支持同时传递多个相同的命令携带不同信息(返回码的此处信息与发码的略微有区别,详情见《WT3000Tx语音合成指令表》介绍);
累加和校验:是指帧长度+流水号+应答标志+数据帧来源+N个命令信息和的低字节。
3.1 GB 2312编码简介
GB 2312码是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集 基本集》,标准号为GB 2312-80(GB是“国标”二字的汉语拼音缩写),由中华人民共和国国家标准总局发布,1981年5月1日实施。习惯上称国标码、GB码,或区位码。它是一个简化字汉字的编码,通行于中国大陆地区。新加坡等地也使用这一编码。GB 2312-80收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共7445个图形字符。其中汉字以外的图形字符682个,汉字6763个。GB 2312-80规定,“对任意一个图形字符都采用两个字节(Byte)表示。每个字节均采用GB 1988-80及GB 2311-80中的七位编码表示。两个字节中前面的字节为第一字节,后面的字节为第二字节。”习惯上称第一字节为“高字节”,第二字节为“低字节”。
识别类型 | 识别编码范围 | 备注 |
半角ASCII符号区 | 0x00——0x7F | |
全角符号区 | 0xA1A0——0xA3FE | |
汉字区 | 0xB0A1——0xF7FE | 共6768个汉字 |
3.2 UTF8编码简介
UTF-8(8位元,UniversalCharacterSet/UnicodeTransformationFormat)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为的个数决定了其编码的位数,其余各字节均以10开头。
UTF-8最多可用到6个字节。
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
识别类型 | 识别编码范围 | 备注 |
全角符号区 | 单字节UTF8字符中的“对应Unicode的0x00区的内容”
双字节UTF8字符中的“对应Unicode的部分00区和全部03区的符号” |
|
汉字区 | 三字节UTF8字符中的“对应Unicode的:20区以上的符号+汉字” | 共20902个汉字 |
四、语音合成功能使用方法
4.1 简单调用方式
简单调用是指用户不用关心芯片当前的工作状态,只需要发送文本到芯片合成为语音输出。
在简单调用情况下,上位机只要与芯片之间建立起UART通信方式,即可发送合成命令来实现文本的合成,上位机不需要判断芯片的回传数据或状态引脚的输出。
注意:如前一帧文本还没有合成完,就再次发送文本到芯片会中断前次合成,而执行新的合成。
4.2 标准调用方式
若上位机需要确保上次文本被完整合成之后,再发送合成命令帧合成下一段文本,则需要通过回传确定芯片的工作状态。具体方法举例如下:应用中需要合成的文本为5k字节,超过了WT3000T8芯片一个命令帧所能容纳的最大文本长度(文本最多支持2016个字节),这时需要分多次给WT3000T8芯片发送文本信息。程序过程如下:
1、上位机先给WT3000T8芯片发送一个文本合成命令帧,携带不超过2016个字节的文本;
2、上位机等待WT3000T8芯片自动返回的回传信息,直到收到回传数据,说明前面的
文本已合成完毕;或使用查询芯片的状态引脚、发送查询命令的方法,确认上一帧文本合成完毕。
3、上位机向芯片再次发送一个文本合成命令帧,发送出剩下的文本,重复123流程直至所有数据发完。
4.3查询芯片工作状态的方法
通过硬件和软件两种方式查询WT3000T8芯片的工作状态。
硬件方式:通过查询输出引脚BUSY的电平,来判断芯片的工作状态。当BUSY处于低电平时,表明芯片正在合成文本;当BUSY处于高电平时,表明芯片处于空闲状态。
软件方式:通过发送状态查询命令帧来查询芯片的工作状态。当收到上位机发送的状态查询命令帧后,芯片会自动向上位机发送当前芯片状态的回传。上位机根据芯片状态的回传数据来判断当前芯片是处于空闲状态还是文本合成状态。
4.4固定语音功能
WT3000T-T001预留了30秒存放固定语音,对批量采购的客户可提供提示音添加、定制的服务。
注意:如有添加提示音的需求,需要提交与商务人员沟通,提供音频和填写相应的资料。
固定语音的特性:
固定语音支持MP3格式,最大支持WAV格式,如果追求更加好的音质和音色所带来的更好的体验,固定语音可以满足客户的这些高需求。相比于WT3000T-T001系列,WT3000T-T002系列芯片可以提供更大的flash空间来存放这些固定语音。
WT3000T-T002系列可提供最高32MBit的语音空间,最多可以放置近100首MP3固定语音。
WT3000T-T002提供以下在ETC使用场景的高品质的内置语音示例:
1 | 静音 |
2 | 前方 |
3 | 米 |
4 | 公里 |
5 | 车道 |
6 | 有车辆发生故障 |
7 | 慢行注意安全 |
8 | 发生事故 |
9 | 道路设施故障 |
10 | 有停驶车辆 |
11 | 有车辆行驶缓慢 |
12 | 请注意保持车距 |
13 | 有车辆逆行 |
14 | 车道行驶缓慢 |
15 | 车道拥堵 |
16 | 有车辆超速行驶 |
17 | 变道时请注意安全 |
18 | 有紧急车辆行驶 |
19 | 请注意避让应急车道 |
20 | 有大货车行驶 |
21 | 请注意行车安全 |
22 | 车辆发生火灾 |
23 | 请绕道行驶 |
24 | 路面发生火灾 |
25 | 路边发生火灾 |
26 | 隧道内发生火灾 |
27 | 道路设施发生火灾 |
28 | 发生地质灾害 |
29 | 发生水灾 |
30 | 有暴雨天气 |
31 | 有冰雹天气 |
32 | 有雷电天气 |
33 | 有大风天气 |
34 | 有大雾天气 |
35 | 有高温天气 |
36 | 有干旱天气 |
37 | 有暴雪天气 |
38 | 有寒潮天气 |
39 | 有霜冻天气 |
40 | 有雾霾天气 |
41 | 有沙尘暴天气 |
42 | 有团雾天气 |
43 | 有横风天气 |
44 | 有物体散落 |
45 | 有液体洒落 |
46 | 有机油泄露 |
47 | 道路有障碍物 |
48 | 注意避让道路行人 |
49 | 注意避让道路动物 |
50 | 道路有积水 |
51 | 道路湿滑 |
52 | 道路结冰 |
53 | 道路塌陷 |
54 | 道路起伏 |
55 | 道路施工 |
56 | 注意慢行或绕道行驶 |
57 | 道路断路施工 |
58 | 有文体商业活动 |
59 | 有外交政务活动 |
60 | 发生燃气事故 |
61 | 请停止行驶 |
62 | 发生化学污染 |
63 | 发生爆炸事故 |
64 | 发生电力事故 |
65 | 发生暴力事件 |
66 | 交通集中堵塞 |
67 | 交易金额 |
68 | 标签拆卸 |
69 | 已预激活 |
70 | 是否激活 |
71 | 标签已激活 |
72 | 电量不足 |
73 | 读卡错误 |
74 | ESAM锁定 |
75 | ESAM出错 |
76 | 操作失败 |
77 | 联系运营商 |
78 | 请插卡 |
79 | 请记账 |
80 | M1卡 |
81 | 唤醒 |
82 | 蓝牙已打开 |
83 | 蓝牙出错 |
84 | 交易成功 |
85 | 余额 |
86 | 版本 |
87 | 0 |
88 | 1 |
89 | 2 |
90 | 3 |
91 | 4 |
92 | 5 |
93 | 6 |
94 | 7 |
95 | 8 |
96 | 9 |
97 | 元 |
98 | 点 |
99 | V |
100 | 一声短“滴” |
101 | 一声长“滴” |
102 | 万 |
103 | 千 |
104 | 百 |
105 | 拾 |
106 | 请充电 |
4.5 测试软件
WT3000T-T001提供了一款好用的方便的上位机软件来进行快速测试和演示。
上位机演示软件操作界面
1. 用串口调试工具连接好WT3000T-T001模块,插到电脑上,双击打开演示软件。
上位机演示软件图标
2. 设置好波特率9600,然后点击打开串口使模块和上位机连接成功。
3. 主播选择:可以选择不同的主播音色,支持男声女声。
4. 语速:可以调节合成语音的语速速度。
5. 语调:可以使主播的音色变得清澈透亮或者雄浑厚重。
6. 音量:调节合成的音量大小。
只需要在文本框中以打字的方式输入想要播出的文本内容,点击生成,再点击发送就可以听到模块播出刚刚输入的文本内容了。
另外,在发送数据和接收数据一栏里还能直接复制生成的串口16进制数据到程序代码中直接使用,快速验证问题。
五、串口控制示例代码
5.1 函数声明,结构体声明
#include <stdio.h>
#include <stdlib.h>
void uart_recive(const unsigned char *packet, unsigned short size);
void keyid_confirm(unsigned short common_id,unsigned char source,void *data);
unsigned char check_data(const unsigned char *packet, unsigned short size);
void uart_send(void);
#define h_16(h,l) (((h)<<8)|l)
struct hex16_format
{
unsigned char head; //包头
unsigned char len_h; //
unsigned char len_l; //len_h len_l包总长度
unsigned char listnum; //流水号
unsigned char flag; //包序&应答标志
unsigned char source; //数据来源
unsigned char payload[0]; //数据开始
};
struct keyid_format {
unsigned char id_h; //KEYID 高字节
unsigned char id_l; //KEYID 低字节
unsigned char length; //KEYID 数据长度
unsigned char data[0]; ////KEYID 数据
};
函数声明,接收结构体声明
//主函数
int main(int argc, char **argv)
{
unsigned char uart_rx_test[] = {0x7E ,0x00 ,0x0F ,0x01 ,0x00 ,0x03 ,0x03 ,0xE8 ,0x06 ,0x31 ,0x32 ,0x33 ,0x34 ,0x35 ,0x36 ,0x39 ,0xEF};//播放123456
uart_recive(uart_rx_test,sizeof(uart_rx_test));//接收数据
return 0;
}
main函数
5.2 串口接收数据处理
//packet:串口接收到的一包数据
//size:串口这一报数据的长度
void uart_recive(const unsigned char *packet, unsigned short size) ///一包数据接收处理及 应答输出
{
struct hex16_format *p1 = (struct hex16_format *)packet;
unsigned char ret=0;
//检测这一包数据是否可用
ret=check_data(packet,size);
if(ret)
{
printf("debug:check_data err=%d
",ret);
return;
}
printf("check_data OK!
");
//数据可用,开始解析KEYID
unsigned int keyid_address=6;
//循环扫描所有keyID
while((keyid_address+3)<(size-2))
{
struct keyid_format *cmd = (struct keyid_format *)(&packet[keyid_address]);//packet[6]刚好u16对齐,不然会内存对齐异常导致出问题
unsigned short common_id=0;
common_id=((cmd->id_h)<<8)|cmd->id_l;
//如果读取到了末尾则退出扫描
if(cmd->length+3+keyid_address>size-2)
{
printf("while end=%d,keyid_address=%d,size=%d
",cmd->length,keyid_address,size);
break;
}
printf("ID=0x%04X,LEN=%d,DATA=%s
",common_id,cmd->length,cmd->data);
//根据ID进行分类处理
keyid_confirm(common_id,p1->source,cmd);
//KEYID地址往下准备读取下一个KEYID
keyid_address += cmd->length+3;
}
}
接收串口数据处理数据
unsigned char check_data(const unsigned char *packet, unsigned short size) ///数据校验:1数据头异常 2数据结尾异常 3总长度异常 4校验异常
{
struct hex16_format *p0 = (struct hex16_format *)packet;
unsigned char err=0;
unsigned short pack_len=0;
//获取帧长度
pack_len=h_16(p0->len_h,p0->len_l);//((p0->len_h)<<8)|p0->len_l;
printf("head=%02X len=%d size - 2=%d
",packet[0],pack_len,size - 2);//log_info("head=%02X len=%d size=%d",p0->head,p0->len,size);
//数据头如果不是0x7e就错误
if(packet[0]!=0x7e)
err=1;
//数据结尾不是0xef就错误
else if(packet[size-1]!=0xef)
err=2;
//获取的帧长度不等于数据长度就错误
else if((pack_len!=0)&&(pack_len!=(size-2)))
err=3;
else ///SUM校验计算
{
unsigned short i=0;
unsigned char sum=0;
for(i=1;i<size-2;i++)
{
sum+=packet[i];
}
if(sum!=packet[size-2])//校验不正确就错误
{
err=4;
printf("sum=0x%02X,packet[%d]=0x%02X
",sum,size-2,packet[size-2]);
}
}
return err;
}
校验接收到的串口这一包数据
void keyid_confirm(unsigned short common_id,unsigned char source,void *data)
{
struct keyid_format *cmd = data;
printf("Chip common_id=%d
",common_id);
switch (common_id)
{
case 0x03e8/* TTS语音合成KEYID */:
/* code */
user_deal();//用户接收处理
break;
default:
break;
}
}
接收的KEYID分类处理
5.3 根据串口协议发送数据
#define USER_KEY_ID 1000
struct user_format {
unsigned char head;
unsigned char len_h;
unsigned char len_l;
unsigned char flows; //流水号
unsigned char sta; //
unsigned char soure; //来源
unsigned char id_h; //KEYID高字节
unsigned char id_l; //KEYID低字节
unsigned char len; //KEYID数据长度
unsigned char status; //KEYID数据
unsigned char sum;
unsigned char end;
};
结构体声明
void uart_send(void)
{
printf("uart_send:");
static unsigned char flows = 0;
struct user_format user_key = {0};
//===============================================================//
//包头
user_key.head = 0x7e;
//一包数据长度
user_key.len_h = (sizeof(struct user_format) - 2) >> 8;
user_key.len_l = (sizeof(struct user_format) - 2);
//流水号
user_key.flows = flows;
//来源
user_key.soure = 0x03;
//回复KEYID和数据
user_key.id_h = (unsigned char) (USER_KEY_ID >> 8);
user_key.id_l = (unsigned char) (USER_KEY_ID);
user_key.len = 0x01;
user_key.status = 0x01;
//校验和
for(int i = 1; i < sizeof(struct user_format)-2 ; i++)
{
user_key.sum += ((unsigned char *)(&user_key))[i];
}
user_key.end = 0xef;//结尾
//==============================================================//
flows++;//流水号
//模拟发送
for(int j = 0; j < sizeof(struct user_format) ; j++)
{
printf("%4x",((unsigned char *)(&user_key))[j]);
}
printf("
");
}
串口发送示例