? ? 之前我寫了一篇《Arduino的智能語言輸入實現(xiàn)》,討論了Arduino與LU-ASR01之間通過串口通信實現(xiàn)Arduino的中文語音輸入,不過那個通信是不完整的,因為LU-ASR01的串口只有一個發(fā)送端口TX,而沒有接收端口RX。其實在真正的應用中,LU-ASR01通常也需要接收上位機的數(shù)據(jù),例如為確保上位機已經(jīng)收到LU-ASR01發(fā)送的數(shù)據(jù),上位機需要返回一個已收到數(shù)據(jù)的應答,又例如上位機想讓LU-ASR01發(fā)出某條語音消息或讓LU-ASR01進行某個操作,都需要由上位機發(fā)送數(shù)據(jù),然后由LU-ASR01接收數(shù)據(jù)后,進行相應的處理。
? ? 為解決LU-ASR01的串口沒有接收端口RX這個問題,我們可以利用LU-ASR01的I/O端口(前文介紹過LU-ASR01共有8個I/O端口),取其中的2個端口挪作串口通信用,然后采用軟串口通信的方式來實現(xiàn)Arduino與LU-ASR01之間的雙向串口通信。
? ? 因為在網(wǎng)上查找不到一點LU-ASR01模塊的軟串口通信資料,只能通過不斷地測試,因為手頭連最基本檢測工具示波器等都沒有,只有一臺電腦、一塊Arduino板和一塊LU-ASR01板,為檢測軟串口有沒有發(fā)送數(shù)據(jù),我甚至只能連接LED到串口,查看在串口發(fā)送數(shù)據(jù)時LED有沒有閃爍。經(jīng)歷了數(shù)十次的失敗,幾乎已經(jīng)絕望地想放棄了LU-ASR01的軟串口通信實現(xiàn),哈哈,最后當然成功啦,不然我就寫不了這篇文章了。
? ? 閑話不說了,本次實驗就是通過由LU-ASR01發(fā)送命令,Arduino收到該命令后,再返回發(fā)送該命令數(shù)據(jù)(即同樣的數(shù)值)到LU-ASR01作為應答,最后LU-ASR01收到了Arduino發(fā)回的該命令數(shù)據(jù),進行比較后(即判別發(fā)送的數(shù)據(jù)與接收到的數(shù)據(jù)是否相等),確認該命令發(fā)送成功了。
? ?本次實驗中,Arduino UNO仍然采用硬件串口通信,使用TX和RX端口,LU-ASR01則使用IO6端口作為發(fā)送數(shù)據(jù)的軟TX,IO7端口作為接收數(shù)據(jù)的軟RX。由Arduino提供5V電源給LU-ASR01(下圖中的紅黑2線),Arduino的TX連接到LU-ASR01的IO7端口(軟RX),Arduino的RX連接到LU-ASR01的IO6端口(軟TX),連接圖如下:
LU-ASR01仍然采用“天問block”的圖形化編程平臺,下面是在“天問block”上的完整程序:
?
?
然后我們將下面的程序下載到Arduino UNO板,完整程序如下:
/*
???Arduino與ASR01語音識別模塊的串口通訊實驗
???為確保ASR01發(fā)送的數(shù)據(jù)能夠接收到,采用應答方式,Arduino每接收到一個可識別的
???命令后,都會將這個命令會送給ASR01
*/
// 定義引腳
const int LedPin = ?13; ?????// led連接的引腳,作為LED燈的正極
char Txbyte; ?//串口發(fā)送的字符數(shù)據(jù)
char Rxbyte; ?//串口讀取的字符數(shù)據(jù)
//初始化
void setup() {
??Serial.begin(9600); //設置串口波特率9600
??pinMode(LedPin, OUTPUT); ?//設置LedPin ???
}文章來源:http://www.zghlxwxcb.cn/news/detail-446770.html
//主程序
void loop() {
????if(Serial.available() > 0){ //當串口緩沖區(qū)有數(shù)據(jù)
??????Rxbyte=char(Serial.read());
????????if(Rxbyte==0x21) { ???//當Rxbyte為0x21則LedPin置高電平,即開燈
??????????Serial.write(Rxbyte);
??????????digitalWrite(LedPin, HIGH);
????????}
????????if(Rxbyte==0x22) { ???//當Rxbyte為0x22則LedPin置低電平,即關燈
??????????Serial.write(Rxbyte);
??????????digitalWrite(LedPin, LOW);
????????}
????????if(Rxbyte==0x20){ ????//當Rxbyte為0x20則Led燈閃3下
??????????Serial.write(Rxbyte);
??????????for(int i=0;i<3;i++){ ??//Led燈閃3下
????????????digitalWrite(LedPin, HIGH);
????????????delay(100);
????????????digitalWrite(LedPin, LOW);
????????????delay(100);
??????????}
????????}
????????delay(2);
??????}
}
? ? 兩邊的程序下載完后,連接好4條聯(lián)線,LU-ASR01首先會播報“我們正在進行實驗,請呼喚我“不赦先生”喚醒我。我暫時休息了,有事請呼喚我:不赦先生”,然后我們呼叫“不赦先生”,則LU-ASR01回答“我在”后就通過軟串口發(fā)送了一個字節(jié)的命令:0x20,Arduino收到0x20后,再次發(fā)送0x20到LU-ASR01;當LU-ASR01收到數(shù)據(jù)后,與之前發(fā)送的數(shù)據(jù)進行比較,如果相等,則播報:“阿杜已經(jīng)收到命令了”,否則等待1秒鐘,沒有收到正確的數(shù)據(jù)0x20,則播報:“超時了,阿杜沒有收到命令,請重新發(fā)”(這里說明下,為簡化程序,程序中沒有再次重新發(fā)送該數(shù)據(jù))。接著可以測試“打開燈光”和“關閉燈光”。文章來源地址http://www.zghlxwxcb.cn/news/detail-446770.html
到了這里,關于Arduino與LU-ASR01語音識別模塊的雙向串口通信實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!