0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用语音指令控制串口输出

安信可科技 来源:安信可科技 2025-09-25 15:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

简介

在上两篇文章中, 我们实现了GPIO输出, 和PWM输出(组件介绍在前文中已经介绍过),在本章节我们将继续进行使用语音指令控制串口输出。

配置Example默认串口数据输出


1、首先修改

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc/user_config.h

中的USER_RUN_DEMO_SELECT为USER_DEMO_UART

8e0833a8-871e-11f0-a18e-92fbcf53809c.png

这样默认运行的程序就是

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/src/examples/hb_uart.c

代码如下所示

#include"user_uart.h"
#include"user_event.h"
#include"user_player.h"
#include"user_config.h"
#defineTAG"hb_uart_voice"
staticuni_pthread_tg_uart_thread_id =0;
staticboolg_uart_thread_running =false;
// 串口发送线程函数
staticvoid_uart_send_task(void*args) {
charbuf[6] = {1,2,3,4,5,6};
intret;
 g_uart_thread_running =true;
while(g_uart_thread_running) {
 LOGT(TAG,"UART send done, ret=%d", ret);
 uni_msleep(2000);// 每隔2秒发送一次
 }
}
// 创建发送线程
staticResult _create_uart_thread(void) {
if(g_uart_thread_running) {
 returnE_OK;
 }
 thread_param param;
uni_memset(¶m,0,sizeof(param));
 param.stack_size = STACK_SMALL_SIZE;
 param.priority = OS_PRIORITY_LOW;
uni_strncpy(param.task_name,"uart_voice",sizeof(param.task_name) -1);
if(0!=uni_pthread_create(&g_uart_thread_id, ¶m, _uart_send_task,NULL)) {
 returnE_FAILED;
 }
uni_pthread_detach(g_uart_thread_id); // 自动资源回收
returnE_OK;
}
// 停止发送线程
staticvoid_stop_uart_thread(void) {
if(!g_uart_thread_running)return;
 g_uart_thread_running =false;
if(g_uart_thread_id !=0) {
 uni_pthread_destroy(g_uart_thread_id);
  g_uart_thread_id =0;
 }
}
// 语音唤醒命令回调
staticvoid_on_wakeup_cmd_cb(USER_EVENT_TYPE event,user_event_context_t*context) {
if(context ==NULL)return;
event_goto_awakend_t*awake = &context->goto_awakend;
if(strcmp(awake->cmd,"wakeup_uni") ==0) {
  _create_uart_thread(); // 启动串口线程
 user_player_reply_list_random(awake->reply_files); // 播放语音回复
 }
}
// 自定义设置命令回调
staticvoid_custom_setting_cb(USER_EVENT_TYPE event,user_event_context_t*context) {
if(context ==NULL)return;
event_custom_setting_t*setting = &context->custom_setting;
if(strcmp(setting->cmd,"TurnOn") ==0) {
  _stop_uart_thread(); // 停止串口线程
 user_player_reply_list_random(setting->reply_files); // 播放语音回复
 }
}
// 注册语音事件回调
staticvoid_register_event_callback(void) {
user_event_subscribe_event(USER_GOTO_AWAKENED, _on_wakeup_cmd_cb);
user_event_subscribe_event(USER_CUSTOM_SETTING, _custom_setting_cb);
}
// 主入口
inthb_user_uart_voice_control(void){
if(0!=user_uart_init(NULL)) {
 LOGE(TAG,"UART init failed");
 return-1;
 }
 _register_event_callback();
return0;
}

其默认行为为创建线程定时发送数据, 然后使用LOG打印。但是它没办法调试。 因此我们做一点简单的修改, 当接受的数据的时候再发送出去。

// 串口发送线程函数
staticvoid_uart_send_task(void*args) {
charbuf[6] = {1,2,3,4,5,6};
intret;
 g_uart_thread_running =true;
while(g_uart_thread_running) {
  LOGT(TAG,"Voice triggered UART send [1, 2, 3, 4, 5, 6]");
  ret = user_uart_send(buf,sizeof(buf));
  LOGT(TAG,"UART send done, ret=%d", ret);
  uni_msleep(2000);// 每隔2秒发送一次
 }
}

2、编译和烧录

8e22f580-871e-11f0-a18e-92fbcf53809c.png



实验现象:串口以9600的波特率持续接收到数据 01,02,03,04,05,06 和程序中的数据对应,正确无误。

8e358614-871e-11f0-a18e-92fbcf53809c.png




发送测试:之后尝试向其发送数据, 查看VC-02是否能正常转发回来(关闭HEX显示, 发送的数据和接受的一致)。

8e56e714-871e-11f0-a18e-92fbcf53809c.png



使用语音命令控制串口发送数据


1、创建文件

hb_user_uart_testing.c在/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/src/examples下

#include"user_uart.h"
#include"user_event.h"
#include"user_player.h"
#include"user_config.h"
#defineTAG"hb_uart_voice"
staticuni_pthread_tg_uart_thread_id =0;
staticboolg_uart_thread_running =false;
// 串口发送线程函数
staticvoid_uart_send_task(void*args) {
charbuf[6] = {1,2,3,4,5,6};
intret;
 g_uart_thread_running =true;
while(g_uart_thread_running) {
 LOGT(TAG,"Voice triggered UART send [1, 2, 3, 4, 5, 6]");
  ret =user_uart_send(buf,sizeof(buf));
 LOGT(TAG,"UART send done, ret=%d", ret);
 uni_msleep(2000);// 每隔2秒发送一次
 }
}
// 创建发送线程
staticResult _create_uart_thread(void) {
if(g_uart_thread_running) {
 returnE_OK;
 }
 thread_param param;
uni_memset(¶m,0,sizeof(param));
 param.stack_size = STACK_SMALL_SIZE;
 param.priority = OS_PRIORITY_LOW;
uni_strncpy(param.task_name,"uart_voice",sizeof(param.task_name) -1);
if(0!=uni_pthread_create(&g_uart_thread_id, ¶m, _uart_send_task,NULL)) {
 returnE_FAILED;
 }
uni_pthread_detach(g_uart_thread_id); // 自动资源回收
returnE_OK;
}
// 停止发送线程
staticvoid_stop_uart_thread(void) {
if(!g_uart_thread_running)return;
 g_uart_thread_running =false;
if(g_uart_thread_id !=0) {
 uni_pthread_destroy(g_uart_thread_id);
  g_uart_thread_id =0;
 }
}
// 语音唤醒命令回调
staticvoid_on_wakeup_cmd_cb(USER_EVENT_TYPE event,user_event_context_t*context) {
if(context ==NULL)return;
event_goto_awakend_t*awake = &context->goto_awakend;
if(strcmp(awake->cmd,"wakeup_uni") ==0) {
  _create_uart_thread(); // 启动串口线程
 user_player_reply_list_random(awake->reply_files); // 播放语音回复
 }
}
// 自定义设置命令回调
staticvoid_custom_setting_cb(USER_EVENT_TYPE event,user_event_context_t*context) {
if(context ==NULL)return;
event_custom_setting_t*setting = &context->custom_setting;
if(strcmp(setting->cmd,"TurnOn") ==0) {
  _stop_uart_thread(); // 停止串口线程
 user_player_reply_list_random(setting->reply_files); // 播放语音回复
 }
}
// 注册语音事件回调
staticvoid_register_event_callback(void) {
user_event_subscribe_event(USER_GOTO_AWAKENED, _on_wakeup_cmd_cb);
user_event_subscribe_event(USER_CUSTOM_SETTING, _custom_setting_cb);
}
// 主入口
inthb_user_uart_voice_control(void){
if(0!=user_uart_init(NULL)) {
 LOGE(TAG,"UART init failed");
 return-1;
 }
 _register_event_callback();
return0;
}

输入上述代码, 其主要的业务逻辑就是通过唤醒命令来触发串口的定时输出,然后通过TrunOn的命令来关闭串口输出的线程。

2、添加编译支持在

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/build/user/src/examples下的subdir.mk添加对当前编译文件的引用。

8e6c0e3c-871e-11f0-a18e-92fbcf53809c.png



3、修改

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc/user_config.h文件, 增加对应的demo宏支持。

8eb93482-871e-11f0-a18e-92fbcf53809c.png



4、修改

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/src/user_main.c,增加对上述自定义宏的支持。

8ed0000e-871e-11f0-a18e-92fbcf53809c.png



5-、编译并且烧录固件。

8e22f580-871e-11f0-a18e-92fbcf53809c.png



实验现象

烧录完成之后, 串口默认不输出任何数据。

8ef950d0-871e-11f0-a18e-92fbcf53809c.png



当识别到语音命令“你好小美” 之后将开始打印01 02 03 04 05。

8f126b6a-871e-11f0-a18e-92fbcf53809c.png



当识别到语音命令“打开灯光” 的时候将删除串口发送进程, 串口停止输出。

8f2c93fa-871e-11f0-a18e-92fbcf53809c.png



如上图所示, 此时的串口处于打开状态,但是没有输出数据。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    116

    文章

    5847

    浏览量

    223823
  • GPIO
    +关注

    关注

    16

    文章

    1313

    浏览量

    55729
  • 串口输出
    +关注

    关注

    0

    文章

    18

    浏览量

    7789

原文标题:【离线语音】安信可VC-01/02二次开发篇: 串口输出

文章出处:【微信号:安信可科技,微信公众号:安信可科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是语音芯片IC的串口通讯协议标准(AT)指令

    的一种通信协议,它为语音芯片的智能交互与控制提供了坚实的桥梁。一、串口通讯协议标准(AT)指令概述串口通讯协议标准(AT)
    的头像 发表于 12-05 08:44 2029次阅读
    什么是<b class='flag-5'>语音</b>芯片IC的<b class='flag-5'>串口</b>通讯协议标准(AT)<b class='flag-5'>指令</b>?

    BC009本地智能语音识别模块

    BC009 本地智能语音识别模块 1、产品特征² 1 米内识别率 90%以上² 可以通过语音指令控制输出² 可以通过单片机串口
    发表于 10-26 14:49

    【大联大品佳 Nuvoton ISD9160语音识别试用体验】-深圳志芯

    测试使用语音识别开发板,经过测试的11条语音指令基本识别准确,有正确反馈,扬声器会播报指令ID号。同时也发现一些问题:1.语音指令无法自由修改,必须通过开发板公司进行修改;2.发出
    发表于 08-21 20:12

    【大联大品佳 Nuvoton ISD9160语音识别试用体验】

    测试使用语音识别开发板,经过测试的11条语音指令基本识别准确,有正确反馈,扬声器会播报指令ID号。同时也发现一些问题:1.语音指令无法自由修改,必须通过开发板公司进行修改;2.发出
    发表于 10-12 15:38

    为何要开发一套无线控文字语音指令系统

    无线控文字语音指令系统背景硬件控制指令指令说明功能效果背景因一项目需求:根据不同情形,发出相应的文字语音,且需要远程控制
    发表于 01-07 06:38

    如何使用语音识别模块与继电器实现控制

    如何使用语音识别模块与继电器实现控制呢?
    发表于 01-19 06:57

    基于n元语法模型的领域语音指令识别

    本文采用一种音素匹配法结合改进了的n元语法模型的方法,对语音指令进行理解。指令按照结构划分类别,通过提取其中关键要素来获取指令语义。音素匹配法可以提取指令中部分或
    发表于 02-23 14:27 11次下载

    使用语音命令控制LED开源分享

    电子发烧友网站提供《使用语音命令控制LED开源分享.zip》资料免费下载
    发表于 10-27 16:35 1次下载
    使<b class='flag-5'>用语音</b>命令<b class='flag-5'>控制</b>LED开源分享

    实现使用语音控制机械臂运动

    使用语音控制myCobot机械臂运动
    的头像 发表于 03-17 18:13 2018次阅读
    实现使<b class='flag-5'>用语音</b><b class='flag-5'>控制</b>机械臂运动

    用语音控制语音命令门锁制作

    电子发烧友网站提供《用语音控制语音命令门锁制作.zip》资料免费下载
    发表于 06-12 10:48 1次下载
    <b class='flag-5'>用语音</b><b class='flag-5'>控制</b>的<b class='flag-5'>语音</b>命令门锁制作

    智能语音窗帘:离线语音控制技术的优势与应用

    离线语音控制技术是无需依赖互联网的语音控制技术,用户只需通过语音指令便可直接控制窗帘的开关等功能
    的头像 发表于 07-07 16:02 2005次阅读
    智能<b class='flag-5'>语音</b>窗帘:离线<b class='flag-5'>语音</b><b class='flag-5'>控制</b>技术的优势与应用

    语音控制空调伴侣插座—离线语音模块的智能家居新篇章

    语音控制空调伴侣插座可以通过与空调的连接,让用户可以用语音指令调整空调温度,无需手动操作空调。
    的头像 发表于 08-15 14:23 1965次阅读
    <b class='flag-5'>语音</b><b class='flag-5'>控制</b>空调伴侣插座—离线<b class='flag-5'>语音</b>模块的智能家居新篇章

    塔式风扇的离线语音控制升级之路

    随着离线语音控制技术的应用,用户只需通过简单的语音指令即可控制塔式风扇
    的头像 发表于 09-06 11:43 1084次阅读
    塔式风扇的离线<b class='flag-5'>语音</b><b class='flag-5'>控制</b>升级之路

    KT148A语音芯片的下载用的是串口,测试可以直接串口指令控制吗?

      KT148A语音芯片的下载用的是串口,那我实际测试是不是可以直接串口指令测试控制?就不用单独写程序去模拟一线
    的头像 发表于 11-14 14:21 1385次阅读
    KT148A<b class='flag-5'>语音</b>芯片的下载用的是<b class='flag-5'>串口</b>,测试可以直接<b class='flag-5'>串口</b>发<b class='flag-5'>指令</b><b class='flag-5'>控制</b>吗?

    语音控制模块工作原理

    ,才能够发出正确的指令语音芯片控制模块是实现 “语音指令 - 设备响应” 的核心组件,其工作原理可拆解为信号采集、处理、识别及指令执行的
    的头像 发表于 06-17 11:49 993次阅读
    <b class='flag-5'>语音</b><b class='flag-5'>控制</b>模块工作原理