單片機(jī)控制GSM模塊實(shí)現(xiàn)短信收發(fā)的軟件設(shè)計(jì)
關(guān)鍵詞:單片機(jī) 短信收發(fā) 軟件設(shè)計(jì)
GSM(Global System for Mobile communication)系統(tǒng)是目前基于時(shí)分多址技術(shù)的移動(dòng)通信體制中,比較成熟完善,且應(yīng)用最廣泛的一種系統(tǒng)。目前已建成的覆蓋全國(guó)的GSM數(shù)字蜂窩移動(dòng)通信網(wǎng),是我國(guó)公眾移動(dòng)通信網(wǎng)的主要方式?;贕SM的短信信息服務(wù),是一種在移動(dòng)網(wǎng)絡(luò)上傳送簡(jiǎn)短信息的無(wú)線應(yīng)用,是一種信息在移動(dòng)網(wǎng)絡(luò)上存儲(chǔ)和轉(zhuǎn)寄的過(guò)程。由于公眾GSM網(wǎng)絡(luò)在全球范圍內(nèi)實(shí)現(xiàn)了聯(lián)網(wǎng)和漫游,建議上述系統(tǒng)不需再組建專用通信網(wǎng)絡(luò),所以具有實(shí)時(shí)傳輸數(shù)據(jù)功能的短信應(yīng)用將得到迅速普及。筆者開發(fā)設(shè)計(jì)的基于GSM網(wǎng)絡(luò)的溫度數(shù)據(jù)采集與無(wú)線傳輸系統(tǒng)正是借助該網(wǎng)絡(luò)平臺(tái),利用短信息業(yè)務(wù)實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)雙向傳遞。系統(tǒng)模型圖如圖1所示。
本系統(tǒng)由數(shù)據(jù)采集部分、數(shù)據(jù)接收和發(fā)送部分、終端處理部分三個(gè)模塊組成。數(shù)據(jù)采集模塊將采集到的溫度數(shù)據(jù)存入存儲(chǔ)器中。數(shù)據(jù)收發(fā)模塊采用雙單片機(jī)共用E2RPOM的方式,單片機(jī)2控制數(shù)據(jù)從存儲(chǔ)器轉(zhuǎn)存入E2PROM中;單片機(jī)1負(fù)責(zé)將數(shù)據(jù)從E2PROM中讀出,并經(jīng)GSM模塊2借助GSM網(wǎng)絡(luò)將數(shù)據(jù)發(fā)送出去。單片機(jī)1不僅控制數(shù)據(jù)的發(fā)送,也控制數(shù)據(jù)的接收。在這里,E2PROM是溫度數(shù)據(jù)臨時(shí)存儲(chǔ)和上傳的中轉(zhuǎn)站。終端處理模塊負(fù)責(zé)將接收到的數(shù)據(jù)交給計(jì)算機(jī)處理,并將處理后的結(jié)果存放到數(shù)據(jù)庫(kù)中,以供查詢。當(dāng)終端處理模塊需要向GSM模塊2發(fā)送控制命令時(shí),GSM模塊2接收過(guò)程正好與上述過(guò)程相反,從而實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)雙向傳遞。
系統(tǒng)中,三個(gè)模塊相互獨(dú)立,彼此又相互依賴,共同完成數(shù)據(jù)的傳輸。數(shù)據(jù)收發(fā)模塊在系統(tǒng)中起著承上啟下的作用,是系統(tǒng)的核心模塊。該模塊以雙單片機(jī)為核心,以RS232通信接口,在物理層上實(shí)現(xiàn)與GSM模塊的連接。由于篇幅的限制,本文主要介紹單片機(jī)控制這一模塊工作的軟件實(shí)現(xiàn)過(guò)程,旨在對(duì)怎樣用單片機(jī)控制GSM模塊收發(fā)短信息進(jìn)行探討。
1 GSM模塊MZ28
MZ28是中興通訊推出的GSM無(wú)線雙頻調(diào)制解調(diào)器,主要為語(yǔ)音傳輸、短信發(fā)送和數(shù)據(jù)業(yè)務(wù)提供無(wú)線接口。MZ28集成了完整的射頻電路和GSM的基帶處理器,特別適合于迅速開發(fā)基于GSM無(wú)線網(wǎng)絡(luò)的無(wú)線應(yīng)用產(chǎn)品。帶有人機(jī)接口(MMI)界面的應(yīng)用產(chǎn)品內(nèi)部與MZ28的通信可通過(guò)標(biāo)準(zhǔn)的串行接口(RS232)進(jìn)行。MZ28使用簡(jiǎn)單的20-PIN ZIP插座與用戶自己的應(yīng)用系統(tǒng)相連,此ZIP連接方式提供開發(fā)所需的數(shù)據(jù)通信、音頻和電源等接口信號(hào)。MZ28可以作為無(wú)線引擎,嵌入到用戶自己的產(chǎn)品當(dāng)中,用戶可以用單片機(jī)或其它CPU的UART口,使用相應(yīng)的AT命令,對(duì)模塊進(jìn)行控制,達(dá)到使其產(chǎn)品可以輕松進(jìn)入GSM網(wǎng)絡(luò)的目的。
2 串口控制SMS的工作原理
單片機(jī)與GSM模塊一般采用串行異步通信接口,通信速度可設(shè)定,通常為19200bps。采用這種RSM232電纜方式進(jìn)行連接時(shí),數(shù)據(jù)傳輸?shù)目煽啃暂^好。RS232接口方式連接,通過(guò)串行接口集成電路和電平轉(zhuǎn)換電路與GSM模塊連接,電路比較簡(jiǎn)單,所涉及的芯片包括單片機(jī)89C52和電平轉(zhuǎn)換芯片MAX232,是非常常見的接口電路。需要說(shuō)明的是,該接口通過(guò)I2C總線擴(kuò)展了一個(gè)E2PROM存儲(chǔ)器芯片AT24C64,它的主要作用是存儲(chǔ)數(shù)據(jù),而且斷電信息也不會(huì)丟失,這些特性正是存儲(chǔ)數(shù)據(jù)所必須的。
GSM的短信息業(yè)務(wù)SMS利用信令信道傳輸,這是GSM通信網(wǎng)所特有的。它不用撥號(hào)建立連接,把要發(fā)的信息加上目的數(shù)據(jù)發(fā)送到短信息服務(wù)中心,經(jīng)短信服務(wù)中心完成存儲(chǔ)后再發(fā)送給最終的信宿。所以當(dāng)目的GSM終端沒(méi)開機(jī)時(shí)信息不會(huì)丟失。每個(gè)短信的信息量限制為160字節(jié)。
現(xiàn)在市場(chǎng)上大多數(shù)手機(jī)均支持GSM07.05規(guī)定的AT指令集。該指令集是ETSI(歐洲通信技術(shù)委員會(huì))發(fā)布的,其中包含了對(duì)SMS的控制。利用GSM手機(jī)的串行接口,單片機(jī)向手機(jī)收發(fā)一系列的AT命令,就能達(dá)到控制GSM模塊收發(fā)SMS的目的。必須注意的是,用單片機(jī)實(shí)現(xiàn)時(shí),編程必須注意它發(fā)送指令與接收到的響應(yīng)都是字符的ASCII碼。用單片機(jī)控制GSM模塊收發(fā)短信息所涉及以的AT指令如表1所列。
表1 AT指令
AT指令 | 功 能 描 述 |
AT+OFF | 關(guān)機(jī)并重新啟動(dòng) |
AT+CSDH=0 | 在TEXT模式下在返回值中不顯示詳細(xì)的頭信息 |
ATE0 | 關(guān)閉回顯 |
AT+CMGF=1 | 選擇短信格式為TEXT模式 |
AT+CMGS | 發(fā)送短信息 |
AT+CMGR | 讀取短信息 |
AT+CMGD=0 | 刪除全部短信息 |
3 軟件實(shí)現(xiàn)
3.1 上位機(jī)模塊和下位機(jī)模塊半雙工通信協(xié)議的實(shí)現(xiàn)
3.1.1 應(yīng)答和重發(fā)
上位機(jī)模塊和下位模塊的通信雙方遵照半雙工通信方式進(jìn)行,即數(shù)據(jù)傳送是雙向的。但是,任何時(shí)刻只能由其中的一方發(fā)送數(shù)據(jù),另一方接收數(shù)據(jù),因?yàn)镋2PROM的讀出和寫入不能同時(shí)進(jìn)行。為了避免一方在發(fā)送信息幀時(shí)(這里的信息幀指的是下位機(jī)模塊發(fā)送的數(shù)據(jù)幀和上位機(jī)模塊發(fā)送的命令幀,下同),另一方也會(huì)發(fā)送數(shù)據(jù),必須把信道變成半雙工方式。盡管這樣效率可能不如全雙工方式,但通過(guò)此舉犧牲效率可以換取模塊工作性能的穩(wěn)定。雙方采取的順序是:發(fā)→收到應(yīng)答后→再發(fā)。
按照整個(gè)系統(tǒng)的設(shè)計(jì)思路,上位機(jī)模塊(即圖1中的GSM模塊1,下同)發(fā)送的幀包括命令幀、確認(rèn)幀和非確認(rèn)幀;下位機(jī)模塊(即圖1中的GSM模塊2,下同)發(fā)送的幀包括數(shù)據(jù)幀、確認(rèn)幀和非確認(rèn)幀。其中確認(rèn)幀和非確認(rèn)幀是發(fā)送數(shù)據(jù)后等待對(duì)方發(fā)送的應(yīng)答幀,以此作為繼續(xù)發(fā)送下一幀和重新發(fā)送上一幀的依據(jù)。命令幀和數(shù)據(jù)幀是信息幀,當(dāng)一方先發(fā)送完信息幀,如果收方接收到對(duì)方的信息幀,而又沒(méi)有信息幀需要發(fā)送,那么情況就比較簡(jiǎn)單,收方將根據(jù)信息幀的正確與否決定發(fā)送確認(rèn)幀還是非確認(rèn)幀,以使對(duì)方?jīng)Q定是繼續(xù)發(fā)送還是重新發(fā)送;如果此刻收方也有信息幀需要發(fā)送,那么收方將不立即發(fā)送應(yīng)答幀,而是立即發(fā)送本方的信息幀給對(duì)方,并等待對(duì)方對(duì)此幀的應(yīng)的應(yīng)答幀,在收到對(duì)方的應(yīng)答幀后,收方將依據(jù)應(yīng)答幀的內(nèi)容(即確認(rèn)幀或者是非確認(rèn)幀,下同)決定是繼續(xù)發(fā)送下一信息幀,還是重新發(fā)送原來(lái)的信息幀。如果由于鏈路本身不可靠等因素造成應(yīng)答幀的丟失,收方將在一定時(shí)間內(nèi)因?yàn)闆](méi)有收到應(yīng)答幀而延時(shí)重發(fā)原來(lái)的信息幀。在收到對(duì)方的應(yīng)答幀后,收方將繼續(xù)發(fā)送下一信息幀,并等待對(duì)方的應(yīng)答幀,如此反復(fù),直到收方全部發(fā)送完信息幀。在本方收到對(duì)方最后一個(gè)應(yīng)答幀后,表明本方全部的信息幀發(fā)送完畢。然后收方將發(fā)送對(duì)方仍然等待的應(yīng)答幀,通知對(duì)方收到的信息幀正確與否。
圖2
在雙方通信過(guò)程中,有兩個(gè)時(shí)間t1和t2,分別表示重新發(fā)送信息幀的最大延時(shí)。t1表示一方發(fā)送完信息幀到收到對(duì)方應(yīng)答幀的時(shí)間,如果等待應(yīng)答幀的時(shí)間超過(guò)了t1,則發(fā)方會(huì)重新發(fā)送原來(lái)的信息幀;當(dāng)收方接收到對(duì)方發(fā)送的信息幀,如果收方此時(shí)有需要發(fā)送的信息幀,則收方此記得不發(fā)送應(yīng)答幀,而是發(fā)送信息幀給對(duì)方。也就是說(shuō),利用對(duì)方等待收方應(yīng)答幀的時(shí)間t1內(nèi),收方插入發(fā)送本文的信息幀,同樣本方的發(fā)送也存在一個(gè)延時(shí)重發(fā)的問(wèn)題。在規(guī)定的時(shí)間內(nèi),如果沒(méi)有收到對(duì)方應(yīng)答幀,收方也同樣需要重發(fā)原來(lái)的信息幀,這個(gè)規(guī)定的時(shí)間就是t2。顯然由于收方是利用間隙時(shí)間發(fā)送本方信息幀,所以t2t1。
圖2以下位機(jī)模塊先發(fā)數(shù)據(jù)幀為例,闡述雙方通信的具體實(shí)現(xiàn)過(guò)程。
需要說(shuō)明的是,由于版面的限制,圖2所示的通信過(guò)程沒(méi)有涉及到發(fā)送非確認(rèn)幀的情況,如果收方發(fā)送非常認(rèn)幀,發(fā)方的發(fā)送過(guò)程跟發(fā)送數(shù)據(jù)幀是一樣的,只不過(guò)這種情況下需要重發(fā)同一幀號(hào)的數(shù)據(jù)幀。如果上位機(jī)模塊先發(fā)命令幀,雙方通信的實(shí)現(xiàn)過(guò)程跟圖2類似,所不同的是數(shù)據(jù)幀此時(shí)變成命令幀,命令幀變成數(shù)據(jù)幀。在延時(shí)的時(shí)間上,無(wú)論是下位機(jī)發(fā)送數(shù)據(jù)幀還是上位機(jī)發(fā)送命令幀,t2的大小都應(yīng)該是一樣的,都是利用時(shí)間間隔t2發(fā)送收方信息幀,延時(shí)的時(shí)間是相同的。然而,對(duì)于t1而方,情況就有所不同。因?yàn)橄挛粰C(jī)模塊先發(fā)送數(shù)據(jù)幀時(shí),利用t1的間隔時(shí)間上位機(jī)模塊發(fā)送的命令幀可靠較少,因此當(dāng)下位機(jī)模塊先發(fā)送數(shù)據(jù)幀時(shí)所定義的t1應(yīng)該小于當(dāng)上位機(jī)模塊先發(fā)送命令幀時(shí),所定義的t1。這是因?yàn)楫?dāng)上位機(jī)模塊先發(fā)送命令幀時(shí),利用t1的間隔時(shí)間下位機(jī)模塊發(fā)送的數(shù)據(jù)幀可能比較多。
3.2 幀格式
GSM模塊通過(guò)異步通信接口實(shí)現(xiàn)對(duì)SMS的控制共有三種接入?yún)f(xié)議:Block Mode;基于AT指令的Text Mode;基于AT指令PDU Mode。本系統(tǒng)發(fā)送和接收的數(shù)據(jù)都是基于數(shù)字的溫度數(shù)據(jù)和命令字,為了保證系統(tǒng)的適用性,SMS的收發(fā)采用TEXT模式。TEXT模式是基于字符的,更具體地說(shuō)是基于ASCII碼的一種結(jié)構(gòu)模式。在該模式下,模塊發(fā)送和接收的信息幀格式如下:
幀頭 | 幀序號(hào) | 數(shù)據(jù) | 校驗(yàn)子 |
信息幀包括數(shù)據(jù)幀和命令幀。
幀頭表示數(shù)據(jù)幀的標(biāo)記,是由固定的字符“WQ”構(gòu)成。
幀序號(hào)表示數(shù)據(jù)幀的序號(hào),由兩個(gè)字節(jié)組成。幀序號(hào)表示下位機(jī)模塊發(fā)送的遞增數(shù)據(jù)幀序號(hào)和上位機(jī)模塊發(fā)送的命令幀序號(hào)。為了簡(jiǎn)化幀結(jié)構(gòu),命令幀的序號(hào)統(tǒng)一為00H。
數(shù)據(jù)字段的長(zhǎng)度為154字節(jié),最多發(fā)送77個(gè)字符(采用TEXT模式,不能發(fā)送漢字)。
檢驗(yàn)子為數(shù)據(jù)字段所有字節(jié)累加和的初碼(原碼取反加1),由一個(gè)字節(jié)組成。
除了信息幀外,雙向傳遞的還有應(yīng)答幀,它包括確認(rèn)幀和非確認(rèn)幀。確認(rèn)幀是雙方反饋給發(fā)方的應(yīng)答幀,表示收方已經(jīng)正確接收到了發(fā)方發(fā)送的信息幀。確認(rèn)幀格式僅包括兩個(gè)字段,且兩個(gè)字段的內(nèi)容都是固定的,即幀頭“WQ”和數(shù)據(jù)字段“ACK”,確認(rèn)幀格式如下。
WQ | ACK |
非確認(rèn)幀是收方給發(fā)方的應(yīng)答幀,表示收方收到的是無(wú)效的信息幀,其格式與應(yīng)答幀格式類似,幀格式如下。
WQ | NACK |
3.3 E2PROM空間的分配
采用8KB的E2PROM,按照每77個(gè)字節(jié)為一個(gè)塊進(jìn)行劃分,共106塊,如圖3所示。
第00、01塊留作系統(tǒng)使用,第02塊~第105塊是數(shù)據(jù)塊,用作存放數(shù)據(jù)。
3.4 收發(fā)端與采集端的握手協(xié)議
收發(fā)端與采集端共用一個(gè)存儲(chǔ)器,即雙CPU對(duì)同一個(gè)E2PROM進(jìn)行操作。實(shí)現(xiàn)方案是分別使兩個(gè)微處理器的一個(gè)I/O腳相連,兩個(gè)CPU采用查詢方式對(duì)此I/O端進(jìn)行查詢。如果某時(shí)候收發(fā)端查詢到本地I/O端為高電平,則單片機(jī)1擁有此存儲(chǔ)器的操作權(quán),可以對(duì)E2PROM進(jìn)行讀寫操作。如果采集端查詢到本地I/O端為高電平,則單片機(jī)2擁有此存儲(chǔ)器的操作權(quán),可以對(duì)它進(jìn)行寫操作。一方操作完畢后將I2C總線置為高電平,表明本端已經(jīng)釋放I2C總線,E2PROM目前處于可用狀態(tài)。
3.5 程序的設(shè)計(jì)
3.5.1 主函數(shù)的設(shè)計(jì)思路
開機(jī)上電后,程序在主函數(shù)中運(yùn)行,單片機(jī)和GSM模塊分別進(jìn)行初始化。單片機(jī)的初始化包括設(shè)置串口工作方式、波特率,并初始化變量參數(shù)和標(biāo)志位。GSM模塊初始化包括重新啟動(dòng)、關(guān)閉回顯、設(shè)置在TEXT模式下的返回值中不顯示詳細(xì)的頭信息、選擇短信格式為TEXT模式、開發(fā)串口中斷準(zhǔn)備接收數(shù)據(jù)。
3.5.2 GSM返回參數(shù)的處理―SHELL函數(shù)
SHELL函數(shù)是進(jìn)入時(shí)鐘中斷程序時(shí)被調(diào)用時(shí),該函數(shù)是對(duì)GSM模塊返回參數(shù)進(jìn)行處理的函數(shù)。根據(jù)系統(tǒng)設(shè)計(jì)的要求,需要對(duì)GSM模塊進(jìn)行下列操作:呼叫對(duì)方模塊號(hào)碼、發(fā)送數(shù)據(jù)、閱讀短信、刪除短信?;谝陨喜僮髦噶?,如果操作成功GSM模塊會(huì)分別返回不同的參數(shù):>、+CMGS、+CMGR、OK。根據(jù)接收到的不同參數(shù),下位機(jī)模塊將轉(zhuǎn)向不同的操作步驟,判斷并改變標(biāo)志位的值。比如,如果某時(shí)刻接收到>,這表明呼叫對(duì)方模塊號(hào)碼獲得成功,接下來(lái)需要發(fā)送數(shù)據(jù)。這時(shí)SHELL函數(shù)將檢查發(fā)送不同數(shù)據(jù)所代表的標(biāo)志位f_sending、f_ack、f_nack,從而決定需要發(fā)送何種類型的數(shù)據(jù)。
進(jìn)入時(shí)鐘中斷調(diào)用SHELL函數(shù)時(shí),如果接收到了返回的參數(shù)+CMTI,表明上位機(jī)模塊向下位機(jī)模塊發(fā)送了短信數(shù)據(jù),可能是命令幀,也可能是確認(rèn)幀或者非確認(rèn)幀。在這種情況下,SHELL函數(shù)需要對(duì)短信內(nèi)容進(jìn)行分析,并根據(jù)短信的內(nèi)容進(jìn)行不同的處理,負(fù)責(zé)完成以上功能的就是ExecData函數(shù),它是被SHELL函數(shù)調(diào)用的,用來(lái)分析并處理短信數(shù)據(jù)。
結(jié)語(yǔ)
通過(guò)以上的分析不難發(fā)現(xiàn),整個(gè)程序錯(cuò)綜復(fù)雜,函數(shù)之間相互牽扯。標(biāo)志位在程序的實(shí)現(xiàn)過(guò)程中扮演著非常重要的角色,正是依靠這些標(biāo)志位,程序才能很好地實(shí)現(xiàn)各個(gè)功能之間的切換,而標(biāo)志位的值是通過(guò)OSM模塊返回的參數(shù)修改的。因此程序的實(shí)現(xiàn)過(guò)程應(yīng)該是閱讀參數(shù)→修改標(biāo)志位→發(fā)送指令。
主函數(shù)、時(shí)鐘中斷和串口中斷程序、SHELL函數(shù)、ExecData函數(shù)貫穿整個(gè)程序的主線和核心部分,對(duì)它們的分析可以理解程序的主體思想,這也正是筆者著重介紹的原因所在。然而這些函數(shù)和中斷程序的實(shí)現(xiàn),還需要依靠其它函數(shù)的配合,比如基于I2C總線的E2PROM操作函數(shù)、字符串操作函數(shù)以及串口發(fā)送函數(shù)等,由于篇幅所限,在此不再介紹。GSM網(wǎng)絡(luò)本身是不完全可靠的,可能會(huì)發(fā)生幀發(fā)送錯(cuò)誤、幀丟失的現(xiàn)象。但是由于重發(fā)、延時(shí)重發(fā)機(jī)制的存在,程序可以最大程度避免上述情況的發(fā)生。在實(shí)際應(yīng)用過(guò)程中,模塊運(yùn)行正常,性能穩(wěn)定,實(shí)時(shí)性好。
單片機(jī)相關(guān)文章:單片機(jī)教程
單片機(jī)相關(guān)文章:單片機(jī)視頻教程
單片機(jī)相關(guān)文章:單片機(jī)工作原理
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
評(píng)論