目錄
- 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) ——工廠模式火焰報警器
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262622.html
標籤:其他
上一篇:DNS域名系統概述及正向決議
下一篇:CenOS7 運維 - DNS域名決議服務 | 正向決議 | 反向決議 | 主從服務器 | 分離決議 | 排錯思路及方案 | 超詳細
