近幾天聽朋友有說到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 }