智能家居 (6) ——语音识别线程控制

目录

  • 语音识别线程控制代码
    • inputCommand.h
    • mainPro.c
    • voiceControl.c
  • 代码测试
  • 往期文章

语音识别线程控制代码

inputCommand.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>struct Command
{char commandName[128];						//“控制方式”名char deviceFilesName[128];					//存放初始化所需文件的路径 串口用到char command[32];							//存放指令int fd;										//存放文件描述符int (*Init)(struct Command *file);			//“初始化”函数指针 C语言要传参 不太好的面向对象int s_fd;char ipAdress[32];char port[12];int (*getCommand)(struct Command *cmd);		//“获取指令”函数指针struct Command *next;
};struct Command *addvoiceControlToCommandLink(struct Command *phead);		//“语音控制”加入指令链表函数声明

mainPro.c

#include <stdio.h>
#include <string.h>
#include "inputCommand.h"
#include <pthread.h>
#include <unistd.h>struct Command *addVoiceControlToCommandLink(struct Command *phead);
struct Command *findCommandByName(char *name,struct Command *phead);		//链节查找函数声明
void *voiceControl_thread(void *data);										//“语音控制”线程函数声明struct Command *cmdhead = NULL;					//创建“指令”链表全局变量int main()
{cmdhead = addVoiceControlToCommandLink(cmdhead);			//“语音控制”对象加入链表pthread_t voiceControl_thread_t;					//存放线程 IDpthread_create(&voiceControl_thread_t,NULL,voiceControl_thread,NULL);		//创建“语音控制”线程pthread_join(voiceControl_thread_t, NULL);			//主函数等待“语音控制”线程退出return 0;
}//“语音控制”线程
void *voiceControl_thread(void *data)	//没用到data  create创建线程没进行传参			
{int nread;struct Command *voiceHandler = NULL;voiceHandler = findCommandByName("voiceControl",cmdhead);		//寻找“语音控制”链节,返回给voiceHandlerif(voiceHandler == NULL){										//找不到printf("find voiceHandler error\n");pthread_exit(NULL);											//线程退出}else{															//找到if(voiceHandler->Init(voiceHandler) < 0){					//初始化printf("voiceHandler init error\n");					//初始化失败pthread_exit(NULL);										//线程退出}while(1){nread = voiceHandler->getCommand(voiceHandler);						//读取指令if(nread == 0){														//没接收到指令printf("No command received\n");}else{																//接收到指令printf("Get command:%s\n",voiceHandler->command);}}}
}struct Command *findCommandByName(char *name,struct Command *phead)			//“控制方式”链表查找链节函数
{struct Command *tmp = phead;if(phead == NULL){return NULL;}while(tmp != NULL){if(strcmp(name,tmp->commandName) == 0){return tmp;}tmp = tmp->next;}return NULL;
}

voiceControl.c

#include "inputCommand.h"			//自定义类文件
#include <unistd.h>int voiceControlInit(struct Command *file);						//“语音控制”功能初始化函数声明int voiceControlGetCommand(struct Command *cmd);					//“获取指令”函数初始化
struct Command *addVoiceControlToCommandLink(struct Command *phead);		//“语音控制”(对象)加入指令链表函数声明struct Command voiceControl = {						//定义“语音控制”对象.commandName = "voiceControl",					//名字.deviceFilesName = "/dev/ttyAMA0",				//树莓派串口文件所在地址.command = {'\0'},								//初始化储存“指令”的空间.Init = voiceControlInit,						//指定“语音控制”功能初始化函数.getCommand = voiceControlGetCommand,			//指定“获取指令”函数
};int voiceControlInit(struct Command *file)  //  C语言要传参,java可直接访问
{int fd;if((fd = serialOpen(file->deviceFilesName,9600)) == -1){		//打开树莓派串口,波特率指定为9600exit(-1);}file->fd = fd;	//(传过来的是地址)打开串口文件成功,返回“文件描述符”到“语音控制”链节中
}int voiceControlGetCommand(struct Command *cmd)
{int nread = 0;nread = read(cmd->fd,cmd->command,sizeof(cmd->command));	//读取串口if(nread == 0){printf("usart for voice over time\n");}else{return nread;            //返回读取到数据的字节数,实际读取的指令放到了command里}												
}struct Command *addVoiceControlToCommandLink(struct Command *phead)	//“语音控制”(对象)加入指令方式链表函数
{if(phead == NULL){return &voiceControl;}else{voiceControl.next = phead;phead = &voiceControl;return phead;}
}

代码测试

注意树莓派串口出厂状态是和蓝牙绑定的,后来我们又用于开机启动字符以及一些调试界面的作用,这里要记得开启树莓派正常的串口通信功能,把串口用于正常的数据通信。

连接好语音模块和树莓派,运行程序。

所有指令均可识别成功!

下一步可根据语音识别出来的不同指令,操控相应继电器,从而实现智能家居对不同灯的语音控制了,详细实现代码在后面博文贴出。

在这里插入图片描述

往期文章

智能家居 (1) ——智能家居整体功能框架
智能家居 (2) ——设计模式的引入
智能家居 (3) ——工厂模式继电器控制灯
智能家居 (4) ——工厂模式火焰报警
智能家居 (5) —— LD3320语音模块二次开发
智能家居 (6) ——语音识别线程控制
智能家居 (7) ——网络服务器线程控制
智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)
网络编程知识预备(1) ——了解OSI网络模型
网络编程知识预备(2) ——浅显易懂的三次握手与四次挥手
网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系
网络编程知识预备(4) ——了解HTTP协议与HTTPS协议
网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页
智能家居 (9) ——人脸识别摄像头安装实现监控功能
智能家居 (10) ——人脸识别祥云平台编程使用
智能家居 (11) ——树莓派摄像头捕捉人脸并识别
智能家居 (12) ——人脸识别整合到智能家居系统
智能家居 (13) ——智能家居加入手机app端控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MIPS结构体传参

本文讲解了C语言运行在MIPS体系中结构体传参的情况 硬件平台&#xff1a;Loongson 3A3000 系统&#xff1a;uos 在《see MIPS run》中11.2.5中描述到&#xff0c;会将结构体成员压缩到各个arg寄存器中进行传递 “we have to pack the register with data to mimic the arran…

对象创建过程之二(类加载器)

2019独角兽企业重金招聘Python工程师标准>>> JAVA为我们提供了两种动态加载机制。 第一种是隐式机制。其实new一个对象和调用类的静态方法时&#xff0c;就是隐式机制在工作。 第二种是显示机制。显示的机制又有两种策略 第一种是用public static Class<?> …

Python_堆栈和队列

堆栈和队列 (1)堆栈&#xff0c;新放进去的先取出 #encodingutf-8 >>> stack [3, 4, 5] >>> stack.append(6) >>> stack.append(7) >>> print (stack) [3, 4, 5, 6, 7] >>> print (stack.pop()) 7 >>> print (stack) […

智能家居 (10) ——人脸识别祥云平台编程使用(编译libcurl库支持SSL,安装SSL依赖库libssl、libcrypto)

目录说明人工智能OCR识别平台介绍人脸识别接口购买编程打通OCR后台实现人脸识别&#xff08;ubuntu上实现&#xff09;问题发现编译libcurl库支持SSL安装SSL依赖库openSSL(使用工具wget)curl库重新配置&#xff0c;编译&#xff0c;安装开启SSL后重新编译人脸识别.C文件传入图片…

srs 服务关闭命令_【经验总结】如何做到网络版工作站与服务器时间同步?

随着行业发展&#xff0c;越来越多的实验室色谱数据工作站由原来的单机版&#xff0c;升级为网络版。升级后带来的益不必多说&#xff0c;那么升级带来的困难你遇到过吗&#xff1f;快来跟小析姐一起看看牛人是如何解决问题的吧。最近公司将色谱工作站进行了升级&#xff0c;采…

oss图片尺寸调用方式_是时候来一场轰轰烈烈的OSS升级了

【摘要】伴随5G和云网部署的持续推进&#xff0c;运营商OSS升级建设都已经在不断加速。| 科 | 技 | 杂 | 谈 |中国通信行业第一自媒体【1】运营商的IT支撑系统&#xff0c;正迫切需要新一轮的调整转型。今天&#xff0c;中国移动在2020全球合作伙伴大会上宣布&#xff0c;全球最…

由C过渡到C++-入门知识点

从C语言过渡到C&#xff0c;这些知识点应该是比较重要的。 目录 第一个C程序名称空间特性coutcin 缺省参数重载提问&#xff1a;为什么C语言不支持重载而C支持 引用常引用 引用与函数返回值对于指针和引用的区别引用的底层实现两者在语法上两者在物理上两者的不同之处 内联函数…

gdb pwndbg插件安装

环境&#xff1a; gdb 9.2ubuntu 20(x64) 连接 pwndbggdb9.2gdb9.2网盘连接 密码: kaq4GDB中文教程 编译gdb 由于发行的gdb比较老&#xff0c;pwndbg建议使用高版本GDB&#xff0c;因此我们下载最新的GDB9.2 安装依赖 #apt install texinfo解压GDB,卸载自带GDB #tar -vxf…

Android--UI之DatePicker、TimePicker...

前言 这一篇博客分别讲解Android平台下&#xff0c;关于日期和时间的几个相关控件。包括DatePicker&#xff08;日期选择控件&#xff09;、TimePicker&#xff08;时间选择控件&#xff09;、DatePickerDialog&#xff08;日期选择对话框&#xff09;、TimePickerDialog&#…

递归和迭代路由_静态路由在以太网接口中的不同书写会导致路由器怎样的操作结果?...

各位小伙伴们&#xff1a;大家好&#xff01;上一节和大家分享了在不同类型的网络中应该使用什么样的静态路由配置命令&#xff1b;今天我们再来看看在常见的多路访问(MBA)网络——以太网中&#xff0c;静态路由的不同书写方式将导致路由器执行那些不同的操作。如下图&#xff…

实验报告三

学 号 201521440010 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验三 密码破解技术 学生姓名 邱景丛 年级 2015 区队 四 指导教师 高见 信息技术与网络安全学院 2016年11月7日 实验任务总纲 2016—2017 学年 第 一 …

设计前沿:25个设计师向您展示 iOS 7 界面

我们中的许多人都对新发布的 iOS 7 用户界面有点失望。扎眼的颜色搭配&#xff0c;难看的图标和可疑的设计决策&#xff0c;导致很多的设计师在 Dribbble 和 Behance 等社交网站分享自己对 iOS 界面设计的诠释。这篇文章集合了一些伟大的想法&#xff0c;改进苹果 iOS 7 的界面…

智能家居 (11) ——树莓派摄像头捕捉人脸并识别

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

centos上使用高版本gcc、g++

0x0 在centos7上gcc版本是4.85&#xff0c;在编译一些代码时需要使用g的一些新特性&#xff0c;而网上大多教程都是重新编译gcc&#xff0c;太麻烦了&#xff0c;在centos 7上默认是yum search不到高版本的gcc的 安装scl scl 是Software collections 的缩写&#xff0c;安装…

【Docker系列教程之一】docker入门

我们在理解 docker 之前&#xff0c;首先我们得先区分清楚两个概念&#xff0c;容器和虚拟机。 我们用的传统虚拟机如 VMware &#xff0c; VisualBox 之类的需要模拟整台机器包括硬件&#xff0c;每台虚拟机都需要有自己的操作系统&#xff0c;虚拟机一旦被开启&#xff0c;预…

Java基础 —— 变量,选择,循环,数组,输入与输出等

目录嵌入式学JAVAJava安卓开发环境搭建并运行HelloWorld概念引入JavaSE,EE,ME的区别JREJDK编程实操&#xff1a;从C面向过程转变变量定义与输出数组的定义与遍历(循环、控制、选择和C完全一样)函数的调用&#xff1a;类比c语言结构体的使用输入数据&#xff1a;Scanner嵌入式学…

ubuntu20 编译dpdk错误 -Werror=address-of-packed-member

0x0 在ubuntu20上编译dpdk 18.11报错&#xff0c;gcc 版本为9.3.0&#xff0c;报错如下&#xff1a; error: converting a packed ‘const struct ether_addr’ pointer (alignment 1) to a ‘unaligned_uint16_t’ {aka ‘const short unsigned int’} pointer (alignment 2…

Java 特性

Java有四大特性&#xff1a; 1.封装&#xff1a;隐藏对象的属性和实现细节&#xff0c;仅仅对外公开接口。 封装具有一下优点&#xff1a; 便于使用者正确、方便的使用系统&#xff0c;防止使用者错误修改系统属性&#xff1b;有助于建立各个系统之间的松耦合关系&#xff1b;…

MyBatis 传递多个参数

2019独角兽企业重金招聘Python工程师标准>>> 在MyBatis中可以用以下的方式来传递多个参数 1. 用java.util.Map来传递, Code 如下: public List<User> getAllUsersByUserName(String username, int start, int limit){Map<String,Object> params new H…

Linux stmac网卡代码分析----probe

probe 主要分析一下驱动的主要框架&#xff0c;必要地方细致分析下 文件位置&#xff1a; drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c 从文件的最后看起&#xff1a; module_pci_driver(stmmac_pci_driver); stmmac_pci_driver结构体如下&#xff0c;里面包含了id_…