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.pswp.cn/news/272176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTP的長鏈接和短鏈接說明

HTTP的長鏈接和短鏈接實際上是TCP的長連接和短鏈接。首先我們先介紹一下TCP/IP協議組四層模型。其中包括以下&#xff1a; 應用層&#xff1a;HTTP、FTP、DNS、TELNET等協議傳輸層&#xff1a;TCP、UDP網絡層&#xff1a;IP、ARP、RARP、ICMP協議等網絡接口層&#xff1a;是TC…

多生產者_你是生產者還是消費者?這決定了你的層次。

不知道你有沒有注意到&#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…

python datetime用法_python datetime用法學習筆記

一、主要思路&#xff1a;1.把表示時間的str轉換為datetime對象2.操作datetime對象輸出期望的時間格式二、把表示時間的str轉換為datetime對象語法&#xff1a;datetime.strptime(date_str, format)示例&#xff1a;date_str "2017-06-23 21:08:12"date_obj dateti…

RocketMQ集成SpringBoot

RocketMQ集成SpringBoot RocketMQ總體架構 RocketMQ基本特性

協議(Protocol)與委托代理(Delegate)

協議(Protocol)的作用&#xff1a; 1. 規范接口&#xff0c;用來定義一套公用的接口&#xff1b; 2. 約束或篩選對象。 代理(Delegate)&#xff1a; 它本身是一種設計模式&#xff0c;委托一個對象<遵守協議>去做某件事情&#xff0c;目的是為了降低對象間的耦合度&#…

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程序等主機方法在主機上部署定…

lj245a引腳功能圖_ULN2003A引腳圖及功能-uln2003a原理

ULN是集成達林頓管IC&#xff0c;內部還集成了一個消線圈反電動勢的二極管&#xff0c;可用來驅動繼電器。它是雙列16腳封裝,NPN晶體管矩陣,最大驅動電壓50V,電流500mA,輸入電壓5V,適用于TTL COMS,由達林頓管組成驅動電路。ULN是集成達林頓管IC,內部還集成了一個消線圈反電動勢…

RocketMQ核心概念

生產者Producer和消費者Consumer NameServer作用 Broker和Topic

交叉編譯、軟硬鏈接

什么是交叉編譯&#xff1f;交叉編譯是一個行為&#xff0c;是在一個平臺上生成另一個平臺上的可執行代碼。 本地編譯&#xff1a;本地編譯可以理解為&#xff0c;在當前編譯平臺下&#xff0c;編譯出來的程序只能放到當前平臺下運行。平時我們常見的軟件開發&#xff0c;都是…

掃地機器人狗毛_掃地機器人:我是清理狗毛的!不是清理狗屎的!

原標題&#xff1a;掃地機器人&#xff1a;我是清理狗毛的&#xff01;不是清理狗屎的&#xff01;掃地機器人可以清潔地面和角落里的垃圾&#xff0c;對于滿是毛毛的鏟屎官家庭來說&#xff0c;簡直就是福音吶&#xff01;不過最近&#xff0c;槽點卻有點多&#xff1a;家里買…

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 指定每兩次屏幕信息刷新之間的時間…

C#基礎之Equals和Dispose

1.equal()和運算符的區別 由于C#中有值類型和引用類型&#xff0c;那么相等也分為值相等和引用相等。先來看一個值類型簡單的例子&#xff0c;順便也寫了string類型的比較。 static void Main(string[] args){int n1 1;int n2 1;Console.WriteLine(n1n2);Console.WriteLine(n…

mysql 時間chuo格式化_Mysql時間戳與時間格式轉換問題匯總

一、時間戳的定義時間戳指格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。二、時間格式轉時間戳的方法使用unix_timestamp函數&#xff0c;如下&#xff1a;SELECT UNIX_TIMESTAMP();//返回當前時間戳SELECT UNIX_TIMESTAMP(2017-12-16 17:29:56) AS t; //返回指定時…