树莓派进阶之路 (029) - 语音识别模块 LD3320(原创)
近几天听朋友有说到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 }