目录
- 语音识别线程控制代码
- 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端控制