【智能家居】三、添加语音识别模块的串口读取功能点
语音识别模块SU-03T
串口通信线程控制代码
- inputCommand.h(输入控制指令)
- voiceControl.c(语音控制模块指令)
- main.c(主函数)
- 编译
- 运行结果
语音识别模块SU-03T
AI智能语音识别模块离线语音控制模块语音识别芯片声控模块SU-03T
离线语音模组 SU-03T开发文档
串口通信线程控制代码
inputCommand.h(输入控制指令)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <wiringPi.h>
#include <wiringSerial.h>struct InputCommand
{char commandName[128]; //“控制方式”名char deviceName[128]; //“设备工厂”名char command[32]; //存放指令int fd; //存放文件描述符(串口/网络)int s_fd; //存放服务器套接字描述符char port[12]; //存放端口号char ipAdress[32]; //存放 IP地址char log[1024]; //日志int (*Init)(struct InputCommand *voice); //“初始化”函数指针int (*getCommand)(struct InputCommand *voice); //“获取指令”函数指针struct InputCommand *next;
};struct InputCommand* addVoiceControlToInputCommandLink(struct InputCommand *phead); //“语音控制”加入指令链表函数声明
voiceControl.c(语音控制模块指令)
#include "inputCommand.h"// 语音控制模块初始化函数
int voiceInit(struct InputCommand *voice)
{int fd;// 打开串口设备 (voice->deviceName),波特率为 115200if ((fd = serialOpen (voice->deviceName, 115200)) < 0) { fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; return 1 ; }voice->fd = fd; // 将文件描述符存储在 voice->fd 中return fd;
}// 从语音控制模块获取指令的函数
int voiceGetCommand(struct InputCommand *voice)
{int nread = 0;// 从串口 (voice->fd) 读取数据到 voice->command 中nread = read(voice->fd, voice->command, sizeof(voice->command));//返回读取到数据的字节数,实际读取的指令放到了command里return nread;
}// 全局变量,表示语音控制的输入命令对象
struct InputCommand voiceControl = {.commandName = "voice",.deviceName = "/dev/ttyS5",.command = '\0',.Init = voiceInit,.getCommand = voiceGetCommand,.log = {'\0'},.next = NULL
};// 将语音控制对象加入到输入命令链表中的函数
struct InputCommand* addVoiceControlToInputCommandLink(struct InputCommand *phead) //“语音控制”(对象)加入指令方式链表函数
{if (phead == NULL) {return &voiceControl;}else {voiceControl.next = phead;phead = &voiceControl;return phead; // 如果链表不为空,将语音控制对象插入到链表头,并返回链表头的指针}
}
main.c(主函数)
#include <pthread.h>
#include "controlDevice.h"
#include "inputCommand.h"// 定义指令工厂初始链表头
struct InputCommand *pcommandHead = NULL;// 查找指令对象 by 名称
struct InputCommand* findCommandByName(char *name, struct InputCommand *phead)
{struct InputCommand *tmp = phead;if (phead == NULL) {return NULL;} else {while (tmp != NULL) {if (strcmp(tmp->commandName, name) == 0) {return tmp;}tmp = tmp->next;}return NULL;}
}// 语音控制线程执行函数
void *voiceControlThread(void *data)
{int nread;struct InputCommand *voiceHandler = NULL;// 查找名为 "voice" 的指令处理对象voiceHandler = findCommandByName("voice", pcommandHead);if (voiceHandler == NULL) {printf("find voiceHandler error\n");pthread_exit(NULL);} else {// 初始化语音控制功能if (voiceHandler->Init(voiceHandler) < 0) {printf("voiceControl init error\n");pthread_exit(NULL);} else {printf("voiceControl init success\n");}while (1) {// 清空指令缓存memset(voiceHandler->command, '\0', sizeof(voiceHandler->command));// 从语音控制模块获取指令nread = voiceHandler->getCommand(voiceHandler);if (nread == 0) {// 串口没有获取到指令printf("No voiceCommand received\n");} else {// 获取到指令printf("Get VoiceCommand --> %s\n", voiceHandler->command);}}}
}int main()
{if (wiringPiSetup() == -1) {fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));return 1;}pthread_t voiceControl_thread;// 指令工厂初始化,将语音控制对象加入到指令链表中pcommandHead = addVoiceControlToInputCommandLink(pcommandHead);// 创建语音控制线程pthread_create(&voiceControl_thread, NULL, voiceControlThread, NULL);// 主函数等待语音控制线程退出pthread_join(voiceControl_thread, NULL);return 0;
}
相关文章:
【智能家居】三、添加语音识别模块的串口读取功能点
语音识别模块SU-03T 串口通信线程控制代码 inputCommand.h(输入控制指令)voiceControl.c(语音控制模块指令)main.c(主函数)编译运行结果 语音识别模块SU-03T AI智能语音识别模块离线语音控制模块语音识别…...
物联网开发(一)新版Onenet 基础配置
onenet新创建的账号,没有了多协议接入,只有新的物联网开放平台 第一讲,先给大家讲一下:新版Onenet 基础配置 创建产品 产品开发-->创建产品 产品的品类选择个:大致符合你项目的即可,没有影响 选择智…...
qt/c/c++文件操作总结
1. 读取文件 1.1 Qt以二进制方式读取大文件返回char* 在Qt中以二进制模式读取一个大文件(以500MB为例)并将其内容存储到char*数组中,需要谨慎处理内存分配。以下是实现这一功能的步骤和示例代码: 1. 打开文件 使用QFile类以二进制模式打开文件。 2. 检查文件大小 使用…...
表示你的shell未被正确配置以使用conda activate--换成清华源anaconda
1 CommandNotFoundError: Your shell has not been properly configured to use conda activate. If using conda activate from a batch script, change your invocation to CALL conda.bat activate.To initialize your shell, run$ conda init <SHELL_NAME>这个错误提…...
VT-MRPA1-151-1X/V0/0控制2FRE16模块式模拟放大器
适用于控制带有电气位置反馈的直动式比例减压阀(DBETR- 1X 类型)或带有电气位置反馈的比例流量控制阀(2FRE... 类型);控制值输入 1 0 V(差动输入); 可分别调节“上/下”斜坡时间的斜…...
无需公网IP实现公网远程访问本地WebDAV服务
windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】 文章目录 windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访…...
远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践
远程服务器QEMUUbuntuGRUBVNC最佳实践 1. 准备2. QEMU启动安装Ubuntu2.1 服务器端2.2 本地端 3. 从服务器终端控制虚拟机GRUB与虚拟机终端 这段时间参与大量内核切换测试工作,实体机需要硬件自检太过笨重,因此主要通过QEMU验证正确性。有一个很大的问题是…...
macbook电脑运行缓慢和卡顿内存怎么清理了?
假如你还在为“你的系统内存不足”的提示所困扰,或者你的Mac电脑突然运行缓慢和卡顿,那么你一般需要认真了解一下macbook内存怎么清理了? MacBook是功能强大的电脑,这点毫无疑问,但是它仍旧会随着时间推移变得运行缓慢。值得庆幸…...
优化用户直播体验:第三方美颜SDK的前沿技术
当下,用户对于直播体验的要求日益提高,其中之一的重要方面就是实时美颜效果。第三方美颜SDK为直播平台和应用提供了强大的美颜功能,极大地改善了用户的直播观感。 一、背景与发展 过去,直播中的美颜往往依赖于主播或用户自行调整…...
UE4/UE5 材质实现带框环形进度条
UE4/UE5 材质实现带框环形进度条 此处使用版本:UE4.27 原理:大圆减小圆可以得到圆环,大圆环减小圆环,可以得到圆环外围线框 实现效果: 实现(为了给大家放进一张面前能看的图,我费劲了心思&…...
Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...
Django 用户验证与权限管理
Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探究一下Django如何处理用户验证和权限管理的。 用…...
二手物品交易系统源码小程序H5闲置物品转让APP成品
这是一个二手物品交易系统的基本功能介绍,以下是对每个功能的详细解释: 商品发布:卖家可以通过系统发布二手商品信息,包括商品详情、价格、图片等。商品展示:系统会将所有发布的二手商品进行展示,买家可以…...
Linux库之动态库静态库
一、什么是库(Library) 二、库的分类 三、静态库、动态库优缺点 四、静态库的制作和使用 五、动态库的制作和使用 SO-NAME–解决主版本号之间的兼容问题 基于符号的版本机制 共享库系统路径 共享库的查找过程 有用的环境变量 gcc 编译器常用选项 Linux共…...
xilinx系列FPGA基于VIVADO的pin delay列表生成说明
目录 1 概述2 示例平台3 操作说明4 注意事项 xilinx系列FPGA基于VIVADO的pin delay列表生成说明 1 概述 本文用于讲诉xilinx系列FPGA基于VIVADO的pin delay列表生成说明,以及一些注意事项,为FPGA设计人员探明道路。 Pin delay 即FPGA内部die到pin的延时…...
1.vue学习笔记(vue简介+API风格+开发前的准备)
1.介绍 1.一款用于构建用户页面的JavaScript框架 2.基于HTML、CSS、JavaScript 3.官方文档:cn.vuejs.org2.渐进式框架 1.注重灵活性/可被逐步集成 根据需求场景:1.无需构建步骤,渐进式增强静态的HTML2.在任何页面中作为Web Components嵌入&…...
树莓派学习:学习opencv+用opencv获取树莓派mjpg摄像头视频流
目录 前提步骤 打开树莓派摄像头 查看是否有图像,登录游览器打开树莓派IP地址的8080端口 获取mjpg的视频流url 代码 先设定好mjpg的视频流的url 利用opencv库中的v2.VideoCapture类读取mjpg视频流 cv2.VideoCapture() 检查摄像头是否成功打开,…...
探索Playwright的现代自动化测试力量
在当今数字化时代,Web应用程序的质量和稳定性对于企业的成功至关重要。为了确保Web应用程序的无缝运行,自动化测试工具成为了开发人员和测试团队的重要工具。多年来,Selenium一直是自动化测试的黄金标准,然而,在不久前…...
游戏mod制作--引擎与解包
摘要 游戏mod的制作过程第一步就是需要将原始的游戏工程文件进行解包,得到相应的资源文件(贴图,音频,事件,模型甚至源代码等),这个时候下一步就是需要将解包出来的文件进行分类索引,…...
3D模型制作木质纹理贴图
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 本文将讲解如何使用GLTF 编辑器 -NSDT 在线材质编辑工具为3D模型设置…...
[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积 1. LIT System:Linear Time Invariant2. 卷积 Convolution3. 单位冲激 Unit Impulse——Dirac Delta 线性时不变系统 : L…...
CSS BFC特性和应用
目录 1,介绍2,BFC布局规则3,创建BFC4,BFC应用1,浮动子元素使父级高度坍塌2,非浮动元素被浮动元素覆盖3,margin 合并1,父子 margin 合并:父级和第1个/最后1个子元素2&…...
软件工程 - 第8章 面向对象建模 - 3 - 动态建模
状态图 状态是指在对象生命周期中满足某些条件、执行某些活动或等待某些事件的一个条件和状况 。 案例一:描述烧水器在工作时的详细行为细节 “人就是一个类,而你”、我”、张三”等都是“人这个类的一个实例,站着”、“躺着等都是对象的一…...
Stable Diffusion AI绘画系列【16】:霸气侧漏的二次元武侠风
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
第二证券:苹果市值重返3万亿美元,关键因素并非人工智能
当地时间12月5日,到美股收盘,苹果公司股价收涨2.1%,报193.42美元,收盘市值重返3万亿美元上方。 上一年12月,苹果公司市值曾在盘中时间短触及3万亿门槛,但收盘并未站稳,本年6月收盘时正式打破3万…...
西南科技大学C++程序设计实验六( 继承与派生一)
一、实验目的 1. 理解不同继承属性对派生类访问基类成员的区别 2. 掌握单继承程序编写 二、实验任务 1、调试下列程序,并在对程序进行修改后再调试,指出调试中的出错原因(该题中A为基类,B为派生类,B以public方式继承A) 重点:理解不同继承方式数据的访问权限,派生类…...
MySQL 性能优化
未完待续... 1. 分库、分表结构优化 1.1 数据库设计 不规范的数据库设计存在数据冗余以及插入、更新、删除异常问题。 规范化(Normalization)是数据库设计的一系列原理和技术,主要用于减少表中数据的冗余,增加完整性和一致性&…...
求职招聘小程序源码系统 全开源源代码:找工作+招人才 平台级别运营版 附带完整的搭建教程
在当前的求职招聘市场中,尽管存在大量的求职者和招聘者,但依然存在着信息不对称、沟通不畅等问题。小编来给大家分享一款求职招聘小程序源码系统,旨在提供一个高效、便捷、安全的求职招聘平台。 以下是部分代码示例: 系统特色功能…...
26、卷积 - 实际上是一个特征提取器
矩阵乘法的本质是特征的融合,卷积算法的本质是特征的提取。 回想一下之前所有介绍卷积的时候,描述了一种卷积运算的场景,那就是一个窗口在图片上滑动,窗口中的数值是卷积核的参数,也就是权值。 卷积的计算本质是乘累…...
web前端之vue3
MENU vue3响应式数据的判断、isRef、isReactive、isReadonly、isProxy、ref、reactive、readonlyvue3的生命周期vue3手写isRef、isReactive、isReadonly、isProxyvue3手写ref、深的refvue3手写shallowRef、浅的refvue3customRefvue3readonly与shallowReadonlyvue3toRaw与markRa…...
图床网站怎么做/哪些网站是营销型网站
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼安装ANT的时候遇到这种问题,自己解决不了了啊Reading package lists... DoneBuilding dependency treeReading state information... DoneYou might want to run apt-get -f install to correct these:The following pa…...
做网站挂靠服务器/百度推广平台首页
文章目录1. let1. 具有块级作用域2. 不存在变量提升3. 暂时性死区4. 经典面试题5. 小结2. const1. 具有块级作用域2. 声明常量时必须赋值3. 常量赋值后,值不能修改4. 小结5. let、const、var的区别3. 解构赋值1. 数组解构2. 对象解构3. 对象的连续解构赋值4. 小结4.…...
网络诈骗做网站 维护/seo教程网站优化推广排名
讲述一下自己的分支合并到 dev 分支的过程;比如自己的分支叫:feature/v1.1-historydata 1.在自己的分支 先 git add . 把修改的代码存到暂存区里面去,然后 git commit -m 提交的提示信息,这个代码的作用是把暂存区的修改好的代码提…...
开原网站开发/长沙seo研究中心
假设文件名是test.txt,需要在第四行前面插入一行"good baby" sed -i 4 s/^/good baby\n/ test.txt 复制代码用system()来执行sed命令方式: http://blog.csdn.net/qq_22122811/article/details/78294744...
学做美食去哪个网站好/软文推广的标准类型
自动生成代码工具 模板文件 package ${javapackage}.po;/*** <p>${title}</p>* 类名:${className}PO<br>* 创建人:${author}<br>* 创建时间:${.now?string("yyyy-MM-dd")}<br>*/ public class ${className}PO {<#list javaPropert…...
深圳网站制作公司报价/seo千享科技
开发 sdk 时经常遇到需要打包的情况,如果是多人开发的 sdk 自然是搭建自动化打包平台,利用自动化打包平台比较方便快捷,但单人开发的 sdk 还是配置打包脚本比较方便快捷,本文介绍两种常见的 sdk 开发方式下的打包方式。 1.使用 co…...