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

   日期:2021-02-23     浏览:110    评论:0    
核心提示:目录1.工厂模式创建语音控制对象:(1)voiceControl.c 文件(语音控制)(2)command.h 文件(指令方式类)2.多线程控制——语音控制(调试):(1)main.c 文件(主函数)3.往期文章:语音识别 > 树莓派串口 > 控制设备1.工厂模式创建语音控制对象:(1)voiceControl.c 文件(语音控制)#include "command.h" //自定义类文件#include <unistd.h>void voiceControlIni

目录

    • 1.工厂模式创建语音控制对象:
        • (1)voiceControl.c 文件(语音控制)
        • (2)command.h 文件(指令方式类)
    • 2.多线程控制——语音控制(调试):
        • (1)main.c 文件(主函数)
        • (2)YS-LDV7语音模块
    • 3.往期文章:

语音识别 > 树莓派串口 > 控制设备

1.工厂模式创建语音控制对象:

(1)voiceControl.c 文件(语音控制)

#include "command.h" //自定义类文件
#include <unistd.h>

void voiceControlInit(struct Command *file);						//“语音控制”功能初始化函数声明
int voiceControlGetCommand(struct Command *cmd);					//“获取指令”函数初始化
struct Command *addVoiceControlToLink(struct Command *phead);
//“语音控制”(对象)加入指令链表函数声明

struct Command voiceControl = { 						//定义“语音控制”对象
	.commandName = "voiceControl",					//名字
	.deviceFilesName = "/dev/ttyAMA0",				//树莓派串口文件所在地址
	.command = { '\0'},								//初始化储存“指令”的空间
	.Init = voiceControlInit,						//指定“语音控制”功能初始化函数
	.getCommand = voiceControlGetCommand,			//指定“获取指令”函数
};

void voiceControlInit(struct Command *file)
{ 
	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));	//读取串口
	return nread;												//返回读取到数据的字节数
}

struct Command *addVoiceControlToLink(struct Command *phead)	//“语音控制”(对象)加入指令方式链表函数
{ 
	if(phead == NULL){ 
		return &voiceControl;
	}else{ 
		voiceControl.next = phead;
		phead = &voiceControl;
		return phead;
	}
}

(2)command.h 文件(指令方式类)

#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <wiringSerial.h>

struct Command
{ 
	char commandName[128];						//“控制方式”名
	char deviceFilesName[128];					//存放初始化所需文件的路径
	char command[32];							//存放指令
	int fd;										//存放文件描述符
	void (*Init)(struct Command *file);			//“初始化”函数指针
	int s_fd;
	char ipAdress[32];
	char port[12];
	int (*getCommand)(struct Command *cmd);		//“获取指令”函数指针

	struct Command *next;
};

struct Command *addvoiceControlToLink(struct Command *phead);		//“语音控制”加入指令链表函数声明

2.多线程控制——语音控制(调试):

(1)main.c 文件(主函数)

仅调试功能

#include <stdio.h>
#include <string.h>
#include "equipment.h"
#include "command.h"

struct Equipment *findEquipByName(char *name,struct Equipment *phead);		//链节查找函数声明
struct Command *findCommandByName(char *name,struct Command *phead);		//链节查找函数声明
void *voiceControl_thread(void *data);										//“语音控制”线程函数声明

struct Command *cmdhead = NULL;					//初始化“指令方式”链表

int main()
{ 
	cmdhead = addVoiceControlToLink(cmdhead);			//“语音控制”对象加入链表

	pthread_t voiceControl_thread_t;					//存放线程 ID

	pthread_create(&voiceControl_thread_t,NULL,voiceControl_thread,NULL);		//创建“语音控制”线程
	
	return 0;
}


void *voiceControl_thread(void *data)				//“语音控制”线程
{ 
	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 Equipment *findEquipByName(char *name,struct Equipment *phead)		//“设备”链表查找链节函数
{ 
	struct Equipment *tmp = phead;

	if(phead == NULL){ 
		return NULL;
	}

	while(tmp != NULL){ 
		if(strcmp(name,tmp->equipName) == 0){ 
			return tmp;
		}
		tmp = tmp->next;
	}
	return NULL;
}

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;
}

(2)YS-LDV7语音模块

待更新

3.往期文章:

设备相关内容见往期文章
智能家居 (1) ——工厂模式继电器控制灯
智能家居 (2) ——工厂模式火焰报警器

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服