一、LD3320概述
1、本模块实际原理为 1 片 STC11 单片机+1 片 LD3320 组合形成的一款语音识别模块,语音识别部分已写好驱动程序,用于只需要对 STC 单片机进行编程加入自己的识别语句和控制程序即可,语音识别部分无需理会和做编程处理。
2、串口连接图
注意电平需要5V
3、语言模块代码的烧录
串口连接后,我们使用stc-isp软件进行代码的烧录
4、代码阅读工具
代码的阅读使用的是Source Insight软件(百度可自行下载)
首先在源代码(是为了让这些代码产生关联)那里新建一个文件夹,然后进入新建的文件夹然后,复制路径。
其次,点击新建的文件夹,复制文件夹路径。
然后打开软件,新建工程,工程存放的路径就是我们刚才复制的路径(放在这个路径下方便添加和查找代码)
点击ok再点击ok,然后出现下图,这时我们需要将源代码添加到我们新建的工程中,点击源代码所在文件夹(code),然后再点击Add all,点击ok,确定,然后关闭即可。
如果右侧已经出现代码结构,则不需要下面的操作,如果没有出现则按下图操作。
接下来如果乱码则继续往下走,点击file然后选择Reload Encoding然后选择编码格式为Chinese Simplified(GB2312),然后点击Load即可。
另一种方法可以永久解决乱码问题,点击Options,然后点击preference,然后点击file,将Default encoding改成SystemDefault(Windows ANSI)或者Chinese Simplified(GB2312)936
然后如果想修改代码大小和格式,点击Options下面的File Type Options,选择自己喜欢的字体。
这个软件的好处就是可以让代码关联起来,那么现在来开启关联。
点击Project选择同步文件Synchrogaze File,同步文件后想要查找某个函数的函数体就很方便了。只需要按住Ctrl此时鼠标变为小手,点击即可跳转。还可以选中你想要查找的目标,然后按住ctrl加斜杠(/)再点击sercher即可在整个工程中查找你选中的目标。
二、语言模块代码的修改
先阅读代码,了解流程。
2、找到修改的地方
(1)LD_AsrAddFixed(); 向LD模块添加关键词 在LDchip.c
(2)识别出结果后,把数据从语音模块发出来void User_handle() 在main函数里
3、修改代码
(1)源代码
(2)默认识别码
上面修改完后对应的宏也要修改。
(3)默认的串口输出
(4)开始修改代码
方框为此次修改的地方,修改完后烧录到语音模块,可先用串口调试。
三、语音模块与树莓派的关联
直接上代码
#include<wiringSerial.h>#include<wiringPi.h>#include<stdio.h>#include<string.h>#include<unistd.h>int main(){int fd;char cmd[128] = {'\0'};int nread;wiringPiSetup();//硬件初始化fd = serialOpen("/dev/ttyAMA0",9600);//打开串口while(1){nread = read(fd,cmd,sizeof(cmd));if(strlen(cmd) == 0)//如果过了一定的时间串口上还是没有信息的话就会打印下面的超时{printf("chaoshi\n");continue;}if(strstr(cmd,"open") != NULL){printf("open light\n");}if(strstr(cmd,"close") != NULL){printf("close light\n");}//printf("getData:%dbyte,contex:%s\n",nread,cmd);memset(cmd,'\0',sizeof(cmd)/sizeof(char));//每次读取完指令并执行对应得操作后,把字符串清空一下}return 0;}
由于我的语音识别的代码里就是输出开灯,关灯,重庆三个内容,所以可以看出代码里就是简单的输出一下三个指令对应的内容。注意:树莓派电脑串口通信代码(树莓派串口一次只能接受8个字节,如果超出8个字节就分多次接收),为了避免一句话多次输出,所以就用到了strstr函数,还有一点要补充一下,read在linux系统中应该是阻塞的,但是在这里没有阻塞,可能是因为串口底层驱动的设置问题,如果长时间没有数据读取到,那么会每隔10s返回一个-1。
学习笔记,仅供参考