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

语音识别线程控制代码

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;					//存放线程 ID

	pthread_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);		//寻找“语音控制”链节,返回给voiceHandler
	if(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){		//打开树莓派串口,波特率指定为9600
		exit(-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端控制

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行稳方能走远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值