zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

树莓派进阶之路 (029) - 语音识别模块 LD3320(原创)

识别模块 进阶 树莓 语音 原创
2023-09-27 14:22:03 时间

  近几天听朋友有说到LD3320 语音模块,刚好身边有块树莓派3,就在某宝上买了块自带mcu的LD3320 。

准备:

  树莓派一个(配置了wiringPi开发环境的详情见本人博客:树莓派进阶之路 (006) - 树莓派安装wiringPi

  LD3320 语音模块一片:https://detail.tmall.com/item.htm?id=41365254224&spm=a1z09.2.0.0.a3beb5clzbCiw&_u=p2cc1o5d426a

  TTL下载器 一块:买模块的时候老板送了一个。

  win电脑:keil (查看51工程代码),WinSCP(树莓派文件挂载),Notepad++(代码编辑)

  或 Ubuntu电脑:gedit(代码编辑),scp(远程文件传输),wine(win环境模拟器为了安装keil 查看51工程代码)

 

开始搞机:

   因为有买的模块已经有现成的51 做 mcu控制芯片,树莓派要做的就是和51做通信交互,我选用的是店家送的TTL下载器通过调用系统USB串口设备进行通信。连线常规链接方式,TTL下载器插在USB接口上:在终端输入 "ls /dev/tty*"

 

  我们可以看到显示有USB设备的,我们只要通过调用系统函数open打开设备描述符就行了。

代码如下(Picustom.h):

 1 # include <stdio.h>
 2 # include <assert.h>                        //测试函数
 3 # include <string.h>        
 4 # include "Picustom.h"                        //自定义头文件
 5 # define uint8 unsigned char                //宏定义
 6 # define N 124
 7 
 8 struct serial_port{
 9     char device[32];                          //设备路径
10     unsigned long baud;                      //波特率
11     int fd;                                 //设备描述符
12     unsigned char dates[1024];              //文件转存
13     unsigned char temp;                     //字符缓存
14     int len;                                //长度
15 };
16 
17 //字符串cp函数
18 char * my_strcpy(char *dest, const char *src){    //将源字符串加const,表明其为输入参数,起到相应的保护作用  
19    assert(src != NULL&&dest != NULL);            //对源地址和目的地址加非0断言  
20    char *ret = dest;  
21    while ((*dest++ = *src++));
22     return ret;                                    //引用返回地址,方便链式操作!!  
23 }
24 //清空serial
25 int clean_serial_port(struct serial_port *serial){
26     memset(serial->dates,0,1024);
27     serial->len = 0;
28     printf("\n");
29     return 0;
30 }
31 //字段尾部加0
32 int set_serial_dates_end(struct serial_port *serial){
33     if('\n' == serial->temp){    
34         printf("\n");
35         serial->dates[serial->len--]='\0';
36     }
37     return 0;
38 }
39 
40 //打印调试
41 int printf_serial_dates(struct serial_port *serial){
42     int i = 0;
43     if('\n' == serial->temp){
44         for(i = 0;i<=serial->len;i++){
45             printf(" %d---%x",i,serial->dates[i]);
46         }
47     }
48     return 0;
49 }
50 
51 //读取完成清空缓存0
52 int clean_serial(struct serial_port *serial){
53     if('\n' == serial->temp){        
54         clean_serial_port(serial);
55     }
56     return 0;
57 }
58 
59 
60 int main(void){
61     struct serial_port serial;
62     wiringPi(0,0);                                      //wiringPi初始化
63     serial.fd = init_serial_port("/dev/ttyUSB0",9600);    //通过树莓派函数打开
64     while(1){
65         serial.temp = Serial_data_read_char_10(serial.fd);
66         printf("%x\t",serial.temp);
67         if(((0xff > serial.temp)&&(0x80 < serial.temp))||(serial.temp == '\r')||(serial.temp == '\n')){
68             serial.dates[serial.len++] = serial.temp;
69             set_serial_dates_end(&serial);        //尾部加0
70             //printf_serial_dates(&serial);        //打印
71         
72         clean_serial(&serial);                    //读取完成清空缓存0
73         }
74         else{                                    //出错清空缓存
75         clean_serial_port(&serial);
76         }
77     }
78     return 0;
79 }