最近有個(gè)朋友問我單片機(jī)如何與手機(jī)進(jìn)行通信,于是我就整理了一篇圖文教程發(fā)給他,順便分享給大家。我們用單片機(jī)做產(chǎn)品的時(shí)候一般都會(huì)遇到單片機(jī)要和手機(jī)通信的情況,所以今天我們就來學(xué)習(xí)一下如何用單片機(jī)和手機(jī)進(jìn)行通信。
中國聯(lián)通的GSM網(wǎng)是向社會(huì)公眾提供通信服務(wù)的公用通信網(wǎng),是目前基于時(shí)多址技術(shù)的移動(dòng)通信體制中,較成熟完善的也是應(yīng)用最廣泛的一種系統(tǒng),是我國公眾移動(dòng)通信網(wǎng)的主要方式。
這個(gè)系統(tǒng)是由數(shù)據(jù)接收和發(fā)送部分、數(shù)據(jù)采集部分、終端處理部分三個(gè)方面組成。
現(xiàn)在我們就來講講單片機(jī)如何與手機(jī)進(jìn)行交互。
整個(gè)系統(tǒng)中,三個(gè)部分是互相獨(dú)立的,但是彼此又相互依賴,共同完成數(shù)據(jù)的傳輸。數(shù)據(jù)收發(fā)模塊在系統(tǒng)中起著承上啟下的作用,是系統(tǒng)的核心模塊。這個(gè)模塊以雙單片機(jī)為核心,用RS232通信接口,在物理層上實(shí)現(xiàn)與GSM模塊的連接。
現(xiàn)在介紹一下它的工作原理是怎樣的
串口控制SMS的工作原理
單片機(jī)與GSM模塊一般是采用串行異步通信接口,通信速度可以進(jìn)行設(shè)定,一般為19200bps。采用這種RSM232電纜方式進(jìn)行連接時(shí),傳輸數(shù)據(jù)的可靠性比較好,通過串行接口集成電路和電平轉(zhuǎn)換電路與GSM模塊進(jìn)行連接,電路相對(duì)來講比較簡單,其中所涉及的芯片包括單片機(jī)89C51與電平轉(zhuǎn)換芯片MAX232,這是很常見的接口電路。需要注意的是,這個(gè)接口通過IIC總線擴(kuò)展了一個(gè)EEPROM存儲(chǔ)器,主要的作用是存儲(chǔ)數(shù)據(jù),而且斷電后信號(hào)也不會(huì)丟失,這些特性是正式存儲(chǔ)數(shù)據(jù)所必須的。
當(dāng)前市場上很多手機(jī)都支持GSM7.05規(guī)定的AT指令集,該指令集是歐洲通信技術(shù)委員單位發(fā)布的,其中就有包含對(duì)SMS的控制,通過GSM手機(jī)的串行接口,單片機(jī)向手機(jī)發(fā)布一系列的AT指令,就可以控制GSM模塊收發(fā)SMS的目的。這里需要注意的是用單片機(jī)實(shí)現(xiàn)時(shí),編程必須要注意它發(fā)送指令與接收到的相應(yīng)字符都是ASCII碼。
軟件實(shí)現(xiàn)的流程講解
上位機(jī)模塊和下位機(jī)模塊半雙工通信協(xié)議的實(shí)現(xiàn)
重發(fā)和應(yīng)答
上位機(jī)模塊和下位機(jī)模塊的通信雙方是遵照半雙工通信方式進(jìn)行的,它的數(shù)據(jù)傳送是雙向的,但是任何時(shí)刻只能由其中一方進(jìn)行數(shù)據(jù)發(fā)送,另一方是數(shù)據(jù)接收,因?yàn)镋EPROM的寫入和讀出是不可以同時(shí)進(jìn)行的,同時(shí)為了避免一方在發(fā)送信息幀時(shí),另一方也會(huì)發(fā)送數(shù)據(jù),所以必須要把信道變成半雙工方式,雖然這樣效率不如全雙工方式,但是可以把模塊的工作性能穩(wěn)定。雙方數(shù)據(jù)發(fā)送的順序是:發(fā)——收到且應(yīng)答——再繼續(xù)發(fā)。
按照這個(gè)系統(tǒng)的思路設(shè)計(jì),上位機(jī)模塊發(fā)送的幀包括確認(rèn)幀、非確認(rèn)幀與命令幀;下位機(jī)模塊發(fā)送的幀包括確認(rèn)幀與非確認(rèn)幀及數(shù)據(jù)幀。其中確認(rèn)幀和非確認(rèn)幀發(fā)送數(shù)據(jù)以后待對(duì)方回應(yīng)發(fā)送的應(yīng)答幀,一次作為繼續(xù)發(fā)送下一幀和重新發(fā)送上一幀的依據(jù)。命令幀和數(shù)據(jù)幀同時(shí)發(fā)送信息幀,當(dāng)一方發(fā)送完成信息幀后,如果接收方收到對(duì)方的信息幀而又沒有信息幀需要發(fā)送,那么這種情況就比較簡單了,接收方會(huì)根據(jù)信息幀的正確與否以此決定發(fā)送確認(rèn)幀還是非確認(rèn)幀,對(duì)方也可因此決定是重新發(fā)送還是繼續(xù)發(fā)送,如果此刻接收方也有信息幀的應(yīng)答幀,那么收方將不立即發(fā)送應(yīng)答幀,而是馬上發(fā)送本方的信息幀給對(duì)方,在收到對(duì)方的應(yīng)答幀后,接收方將依據(jù)應(yīng)答幀的內(nèi)容決定是繼續(xù)發(fā)送下一信息幀還是重新發(fā)送原來的信息幀。
延時(shí)重發(fā)
雙方在通信的過程當(dāng)中,有兩個(gè)時(shí)間T1和T2分別表示重新發(fā)送信息幀的最大延時(shí),T2表示一方發(fā)送信息幀收到對(duì)方的應(yīng)答幀的時(shí)間,如果等待應(yīng)答幀的時(shí)間超過了T1,則發(fā)送會(huì)重新發(fā)送原來的信息,當(dāng)收方接收到對(duì)方發(fā)送的信息幀,如果對(duì)方這時(shí)候還有繼續(xù)要發(fā)送的信息幀,接收方此時(shí)是不發(fā)送應(yīng)答幀的,而是發(fā)送信息幀給對(duì)方。這種情形就是說,利用對(duì)方等待接收方應(yīng)答幀的時(shí)間在T1內(nèi),接收方插入發(fā)送本方的信息幀,一樣本方發(fā)送的信息幀也有一個(gè)延時(shí)重發(fā)的問題。
在規(guī)定的時(shí)間內(nèi),如果沒有收到對(duì)方應(yīng)答幀,接收方同樣也需要將原來的信息幀重發(fā),規(guī)定的這個(gè)時(shí)間就是T2,很明顯接收方是利用時(shí)間間隙來發(fā)送本方的信息幀的,所以TIT2。
程序設(shè)計(jì)
主函數(shù)的設(shè)計(jì)思路
開機(jī)上電之后,程序在函數(shù)中運(yùn)行,GSM模塊和單片機(jī)分別會(huì)進(jìn)行初始化,單片機(jī)的初始化包括設(shè)置串口的工作方式,波特率,并初始化變量和標(biāo)志位,GSM模塊初始化包括有關(guān)閉回顯、重新啟動(dòng)、設(shè)置在TEXT模式下的返回值中不顯示詳細(xì)的頭信息,選擇的短信的格式也包括TEXT模式,并且發(fā)串口中斷準(zhǔn)備數(shù)據(jù)接收。
GSM返回函數(shù)的處理,用于處理GSM模塊返回參數(shù)的SHELL函數(shù)
SHELL是進(jìn)入時(shí)鐘中斷程序時(shí)被調(diào)用時(shí),該函數(shù)是對(duì)GSM模塊返回的參數(shù)進(jìn)行處理的函數(shù),根據(jù)系統(tǒng)設(shè)計(jì)的要求,GSM模塊需要進(jìn)行以下操作:呼叫對(duì)方模塊號(hào)碼、閱讀短信、刪除短信、發(fā)送數(shù)據(jù)。基于以上的各種操作指令,操作如果成功GSM模塊會(huì)分別返回不同的參數(shù):+CMGR、+CMGS、>、OK。根據(jù)收到各種不用參數(shù),下位機(jī)模塊會(huì)轉(zhuǎn)向不同的操作步驟,以此來判斷并改變標(biāo)志位的值。
處理不同的短信數(shù)據(jù)——EXECDATA函數(shù)
進(jìn)入時(shí)鐘中斷調(diào)用SHELL函數(shù)時(shí),如果可以接收到返回的參數(shù)+CMTI,就表示了上位機(jī)??煜蛳挛粰C(jī)發(fā)送了短信數(shù)據(jù),這個(gè)數(shù)據(jù)可能是命令幀,也可能是確認(rèn)幀或者非確認(rèn)幀。一般在這種情形下,SHELL函數(shù)需要對(duì)短信內(nèi)容進(jìn)行分析,并且根據(jù)不同的短信內(nèi)容進(jìn)行處理,負(fù)責(zé)完成以上短信數(shù)據(jù)處理的功能就是EXECDATA函數(shù),EXECDATA函數(shù)是被SHELL函數(shù)調(diào)用的,主要是用于分析和處理短信數(shù)據(jù)的。
更多關(guān)于單片機(jī)與手機(jī)交互請(qǐng)關(guān)注昇潤科技公眾號(hào):Tunercom168