LD3320语音识别模块二次开发及与树莓派间的通讯

实物图如下:
在这里插入图片描述

  • 一般这种模块的资料厂家都会给,需要的话可以私信我发邮箱,下面介绍该模块的各种参数。
  • 型号:YS-LDV7
  • 名称:一体化语音识别模块
  • 规格:43*29.7MM
  • 供电电压:5V (内部工作电压 3.3V)
  • 待机电流:30MA 识别时电流:45MA
  • IO 口输出:高电平为 3.3V
  • 通信方式:串口通信(5V TTL 电平,不可直接接 RS232、RS485)
  • 单片机参数:型号–>STC11L08XE 、flash–>8k、SRAM–>1280、eeprom–>32k
  • 识别词条个数:50 句
  • 工作温度:-20 至 60℃
  • 本模块实际原理为 1 片 STC11 单片机+1 片 LD3320 组合形成的一款语音 识别模块,语音识别部分已写好驱动程序,用于只需要对 STC 单片机进行编 程加入自己的识别语句和控制程序即可,语音识别部分无需理会和做编程处 理。
  • 实物连接图
    在这里插入图片描述
  • 模块下载程序需要用到STC-ISP这个软件,本模块的程序下载实际为 STC 单片机的程序下载方法,首先我们需要安装 USB 转 TTL 驱动(如已安装无需再安装),然后接好 USB 转 TTL。按照下图进行选择各个选项。
    在这里插入图片描述
  • 这里使用一个代码阅读器——sourceInsight(需要的私信)
  • 首先在源代码(是为了让这些代码产生关联)那里新建一个文件夹,然后进入新建的文件夹然后,复制路径。
    在这里插入图片描述
  • 打开sourceInsight新建一个工程,工程存放的路径就是我们刚才复制的路径(放在这个路径下方便添加和查找代码,注意路径不要有中文)
    在这里插入图片描述
  • 点击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即可在整个工程中查找你选中的目标。
    在这里插入图片描述

LD3320语音模块代码阅读(以下只是main函数部分代码):

void  main(void)
{uint8 idata nAsrRes;uint8 i=0;Led_test();//开机闪烁3次MCU_init();//单片机本身初始化,开启中断LD_Reset();//LD3320初始化UartIni(); //串口初始化,上电后让串口打印东西nAsrStatus = LD_ASR_NONE;		//	初始状态:没有在作ASR#ifdef TEST	//这里的意思是,在代码里有TEST这个宏,下面一段代码参与编译,否则不参与编译PrintCom("一级口令:小杰\r\n"); /*text.....*/PrintCom("二级口令:1、代码测试\r\n"); /*text.....*/PrintCom("	2、开发板验证\r\n"); /*text.....*/PrintCom("	3、开灯\r\n"); /*text.....*/PrintCom("	4、关灯\r\n"); /*text.....*/PrintCom("  5、北京\r\n"); /*text.....*/PrintCom("	6、上海\r\n"); /*text.....*/PrintCom("	7、广州\r\n"); /*text.....*/#endifwhile(1){switch(nAsrStatus){case LD_ASR_RUNING:/*表示LD3320正在作ASR识别中*/case LD_ASR_ERROR:	/*表示一次识别流程中LD3320芯片内部出现不正确的状态*/break;case LD_ASR_NONE:/*	表示没有在作ASR识别*/{nAsrStatus=LD_ASR_RUNING;if (RunASR()==0)	/*启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR。RunASR运算功能描述:运行ASR识别流程,入口参数:none,返 回 值:asrflag:1->启动成功, 0—>启动失败*/{nAsrStatus = LD_ASR_ERROR;}break;}case LD_ASR_FOUNDOK: /*	一次ASR识别流程结束,去取ASR识别结果*/{				nAsrRes = LD_GetResult();		/*获取结果*/User_handle(nAsrRes);//用户执行函数,根据返回值进行串口输出nAsrStatus = LD_ASR_NONE;//完成一次识别后,将nAsrStatus置为LD_ASR_NONEbreak;}case LD_ASR_FOUNDZERO:default:{nAsrStatus = LD_ASR_NONE;break;}}// switch	 			}// while
}

分析完整体的代码,如果只需要指令是在LDChip.c这个文件里面的LD_AsrAddFixed()这个函数里面去修改,主要是下图部分:(注意不要忘记将LDChip.h里面的宏修改一下,还要有要改main.c里面的User_handle()里面的代码)
在这里插入图片描述单片机C语言code是什么作用?

  • code的作用是告诉单片机,我定义的数据要存储在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVC(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(存储器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM(存储器)的意思。
  • 程序可以简单的分为code(程序)区,和data
    (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code区也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是运行速度要慢很多,主要读flash比读ram要费时间),因此一般的做法是要将程序放到flash里面,然后load到
    ram里面运行的;DATA区就没有什么选择了,肯定要放在RAM里面,放到rom里面改动不了。

附:

  • c51中的存储类型
  • code :程序存储区(64KB)
  • data :可直接寻址的内部数据存储区(128B)
  • idata:不可直接寻址的内部数据存储区(256B)
  • bdata:可位寻址内部数据存储区(16B)
  • xdata:外部数据存储区(64KB)
  • pdata:分页的外部数据存储区

树莓派和电脑之间的串口通信(基于WringPi库,使用时需要包含头文件:#include <wiringSerial.h>):

  • 初次使用树莓派串口编程,需要配置。
  • 修改 cmdline.txt文件 ,cd /boot/sudo vim cmdline.txt,删除【】之间的部分dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwai
  • 修改 inittab文件 ,cd /etc/sudo vim inittab注释掉最后一行内容:,在前面加上 # 号,我这里没有找到这个文件,查找文件命令可以使用sudo find -name inittab
  • sudo reboot 重启

在linux下面一切皆文件,进入到dev这个文件下面,如下图所示(串口就是在下面的那一个文件夹): 其中fb0是显示器、mem是内存、rem是磁盘、input是输入系统的一些设备。
在这里插入图片描述
树莓派电脑串口通信代码(树莓派串口一次只能接受8个字节,如果超出8个字节就分多次接收):

#include<stdio.h>
#include<wiringSerial.h>
#include<wiringPi.h>
#include <unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{int fd;int readsize;char* readbuf;readbuf=(char*)malloc(128);wiringPiSetup();//init IOfd=serialOpen("/dev/ttyAMA0",115200);//open serial,("file adress")while(1){memset(readbuf,'\0',128);//serialPutchar(fd,'h');                //serialPuts(fd,"ello\r\n");while(serialDataAvail(fd)>0){memset(readbuf,'\0',128);readsize=read(fd,readbuf,128);serialFlush(fd);printf("read %d,context is %s\n",readsize,readbuf);}delay(1000);//serialClose(fd);}return 0;
}

树莓派和LD3320语音模块之间的通信:

  • 首先是接线:rxd和trd交叉连接,将语音模块的VCC和GND连接到树莓派,VCC接5V,查看树莓派引脚功能指令:gpio readall,read函数在没有数据的时候会阻塞,但是在这里没有阻塞,可能是因为串口底层驱动的设置问题。
#include<stdio.h>
#include<wiringSerial.h>
#include<wiringPi.h>
#include <unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{int fd;int readsize;char* readbuf;readbuf=(char*)malloc(8);wiringPiSetup();//init IOfd=serialOpen("/dev/ttyAMA0",115200);//open serial,("file adress")while(1){while(serialDataAvail(fd)>0){memset(readbuf,'\0',8);readsize=read(fd,readbuf,8);printf("cmd is %s",readbuf);//readbuf里面存放的是语音模块串口发送的指令。  }}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多生产者_你是生产者还是消费者?这决定了你的层次。

不知道你有没有注意到&#xff0c;每天乘坐地铁上下班的时候&#xff0c;大部分人都在刷剧、看视频、打游戏等等&#xff0c;总之都属于玩乐。用生产和消费的关系来看的话&#xff0c;其实这一大部分人都属于消费者&#xff0c;“时间和注意力”是他们用于交换的筹码&#xff1…

eclipse Android 开发基础 Activity 窗体 界面

eclipse Android 开发基础 新建工程 新建布局layout,new Android Activity就相当于窗体Form。 新建Activity自动生成src下同名的java代码。 public class Tform2activity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(saved…

8 种常被忽视的 SQL 错误用法

来源&#xff1a;http://t.cn/R6UMaA11、LIMIT 语句2、隐式转换3、关联更新、删除4、混合排序5、EXISTS语句6、条件下推7、提前缩小范围8、中间结果集下推总结sql语句的执行顺序&#xff1a;FROM <left_table>ON <join_condition><join_type> JOIN <right…

变频器按启动没反应_起重机软启动柜晶闸管损坏维修几大故障

缺相保护功能&#xff1a;工作时&#xff0c;软起动器随时检测三相线电流的变化&#xff0c;一旦发生断流&#xff0c;即可作出缺相保护反应。过热保护功能&#xff1a;通过软起动器内部热继电器检测晶闸管散热器的温度&#xff0c;一旦散热器温度超过允许值后自动关断晶闸管&a…

Redis 的各项功能解决了哪些问题?

作者丨blackheart先看一下Redis是一个什么东西官方简介解释到&#xff1a;Redis是一个基于BSD开源的项目&#xff0c;是一个把结构化的数据放在内存中的一个存储系统&#xff0c;你可以把它作为数据库&#xff0c;缓存和消息中间件来使用。同时支持strings&#xff0c;lists&am…

RocketMQ集成SpringBoot

RocketMQ集成SpringBoot RocketMQ总体架构 RocketMQ基本特性

ASP.NET Core 2.2+Quartz.Net 实现Web定时任务

作者&#xff1a;Julian_酱链接&#xff1a;http://www.cnblogs.com/mi12205599/p/10361763.html作为一枚后端程序狗&#xff0c;项目实践常遇到定时任务的工作&#xff0c;最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定…

RocketMQ核心概念

生产者Producer和消费者Consumer NameServer作用 Broker和Topic

交叉编译、软硬链接

什么是交叉编译&#xff1f;交叉编译是一个行为&#xff0c;是在一个平台上生成另一个平台上的可执行代码。 本地编译&#xff1a;本地编译可以理解为&#xff0c;在当前编译平台下&#xff0c;编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发&#xff0c;都是…

Linus下安装maven

下载maven安装包 wget http://mirror.bit.edu.cn/apache/maven/binaries/apache-maven-3.2.2-bin.tar.gz 解压 tar -zxvf apache-maven-3.2.2-bin.tar.gz 配置maven环境变量 查看maven解压后安装包目录 vi /etc/profile 进入最底部&#xff0c;按insert,添加环境变量&#x…

linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

首先下载树莓派linux内核源码&#xff1a; 下载网址&#xff1a;https://github.com/raspberrypi/linux在树莓派使用指令&#xff1a;uname -r查看当前树莓派的版本号&#xff0c;然后选择对应的linux内核版本号进行下载。 将linux内核源码从共享文件夹拷贝到SYSTEM文件夹&am…

Linux实时查看进程命令top笔记

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示Linux系统中各个进程的资源占用状况&#xff0c;类似于Windows系统的任务管理器功能。 top命令的语法格式&#xff1a; top [-] [d] [p] [q] [c] [C] [S] [s] [n] 常用参数说明 d 指定每两次屏幕信息刷新之间的时间…

文件系统(文件系统目录结构、磁盘分区、虚拟文件系统)、linux内核结构框图

什么是文件系统&#xff1f; 常规认知就是根目录下那些文件&#xff0c;但其实并不是那样。文件系统是操作系统用于明确存储设备&#xff08;常见的是磁盘&#xff0c;也有基于NAND Flash的固态硬盘&#xff09;或分区上的文件的方法和数据结构&#xff1b;即在存储设备上组织…

Linux进程终止命令kill或kill all​笔记

在linux命令下&#xff0c;如果需要终止某个进程&#xff0c;可以使用kill或者killall等命令来实现。终止命令的原理都是向linux内核发送一个系统操作的信号以及某个进程的ID&#xff0c;然后系统内核会根据指定的进程ID进行相应的处理。 kill命令典型的用法&#xff1a;首先使…

linux驱动(驱动编译、字符设备驱动框架、交叉编译树莓派驱动、树莓派驱动本地编译)

什么是驱动&#xff1a; 驱动就是对底层硬件设备的操作进行封装&#xff0c;并向上层提供函数接口。 设备分类&#xff1a; linux系统将设备分为3类&#xff1a;字符设备、块设备、网络设备。 字符设备&#xff1a;指只能一个字节一个字节读写的设备&#xff0c;不能随机读取…

docker启动报错  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --

docker启动报错 : (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --to-destination 172.17.0.2:9876 ! -i docker0: iptables: No chain/target/match by that name. 解决方案&#xff1a; systemctl restart docker

最详细的docker安装rocketMQ教程来了

RocketMQ是一款分布式、队列模型的消息中间件&#xff0c;是由阿里巴巴设计的&#xff0c;具有以下特点&#xff1a; 支持严格的消息顺序 支持Topic与Queue两种模式 亿级消息堆积能力 比较友好的分布式特性 同时支持Push与Pull方式消费消息 历经多次天猫双十一海量消息考验…

树莓派IO口驱动代码的编写、微机总线地址、物理地址、虚拟地址、BCM2835芯片手册

地址总线&#xff1a; 百度百科解释&#xff1a; 地址总线 (Address Bus&#xff1b;又称&#xff1a;位址总线) 属于一种电脑总线 &#xff08;一部份&#xff09;&#xff0c;是由CPU 或有DMA 能力的单元&#xff0c;用来沟通这些单元想要存取&#xff08;读取/写入&#xff…

夺命雷公狗---DEDECMS----26dedecms面包屑导航的实现

我们在很多项目里面都会用到面包屑导航&#xff0c;而dedecms里面也是给我们封装好面包屑导航的了,如下图所示&#xff1a; 在dede里面实现面包屑导航主要用到{dede:field.position/}标签&#xff0c;我们首先来修改下article_movie.htm内容页的模版文件&#xff1a; 我们修改成…