利用GSM短信實現實時數據通信
1 GSM模塊軟硬件接口的幾個問題
GSM模塊一般帶有標準的異步串行接口,MCU通過該串行接口向GSM模塊發(fā)送命令和數據,也通過它接收GSM模塊的信息和數據。
GSM模塊上電后首先要進行初始化。一般來說,MCU首先可向它發(fā)送一AT命令“ATEO”,以消除“回顯”,盡量減少MCU串行口接收到的字符;然后發(fā)送AT命令“CNMI”,將GSM模塊設置為“主動通知模式”。這樣當GSM模塊收到短信后便會主動地向串口發(fā)送信息“CMTI”通知MCU,表示有新的短信到達。另外,還要檢查信箱中是否存放有短信。若有,則將其一一讀出,然后逐一刪除,以保持信箱中為空。
GSM模塊開始工作后,每當收到短信時便會主動通過串口向MCU發(fā)送信息“CMTI”,MCU接收到此信息后發(fā)出AT命令“CMGR”讀取短信,GSM模塊即將該短信通過串行口發(fā)送給MCU,由MCU判斷該短信是本系統(tǒng)內的正常數據,還是廣告或其他信息。如果是本系統(tǒng)內的正常數據,則提取該短信中的數據,同時發(fā)出AT命令“CGMD”以刪除該短信;如果不是正常數據,則直接刪除該短信。MCU發(fā)送短信的過程如下:首先,MCU發(fā)送AT命令“CMGS”;然后,等待GSM模塊的允許發(fā)送短信的響應信息“>”,MCU收到響應信息后即可發(fā)送數據,GSM模塊將數據以短信形式發(fā)送;最后,GSM模塊通過串行口向MCU發(fā)出短信發(fā)送成功與否的信息。上述過程如圖1所示。從GSM模塊中讀出的信息除短信本身外,還包括一些其他信息,如SIM卡號、日期時間、各種間隔/結束字符等。在此過程中MCU的串行口會頻繁地收到大量數據,因此必須要為串口設置足夠的接收緩沖區(qū)。但由于MCU內RAM資源有限,為有效地使用資源,可將接收緩沖區(qū)設置為環(huán)形,緩沖區(qū)的大小應保證能夠容納一條最長的短信,再加上其他附加信息的長度。至于發(fā)送緩沖區(qū),直接設定為合適大小即可。
2 具體實現
在MCU與GSM模塊通過串行口交換數據的過程中,一般串行口可用中斷方式。MCU發(fā)送數據的情況較簡單,故這里的重點是MCU串行口的接收。如前所述,接收緩沖區(qū)應設置為環(huán)形,由于MCU的存儲器實際上是線性結構,因此環(huán)形緩沖區(qū)是通過指針操作實現的。
初始化時使輸入/輸出指針(datain/dataout)同時指向開始位置,此時緩沖區(qū)為“空”。串口接收程序CommIsr()每向緩沖區(qū)中放入1個寧符后,使輸入指針向后移動1位;移動到最右邊時,指針應循環(huán)移動到緩沖器的左邊;當輸入指針移動到輸出指針右邊l位時,緩沖區(qū)為“滿”,此時便不能再向緩沖區(qū)中放入字符。短信數據處理程序GetShortMsg()每從緩沖區(qū)中取出1個字符,輸出指針移動l位,方法同輸入指針。當輸出、輸入指針重合時,緩沖區(qū)為“空”。在工作中串行口接收中斷程序將接收的每1個字符按順序放入緩沖區(qū)中,而短信數據處理程序按順序從緩沖區(qū)中取出每個字符,兩者形成“生產者和消費者”的關系,如圖2所示。
工作時系統(tǒng)主程序町以隨時檢查緩沖區(qū)中是否有接收的數據(即檢查緩沖區(qū)是否為“空”),但為減小數據處理程序的開銷,可在只有接收程序收到一個完整的幀時才使用某種信號或標志通知主程序進行,然后由主程序調用短信數據處理程序處理。通過分析可知,GSM模塊發(fā)送信息時一般用連續(xù)的兩個字符OxD和OxA結束,故MCU的串口接收程序可以在收到OxD和0xA時建立標志或發(fā)信號,數據處理程序檢查到標志后即可獲取、分析緩沖區(qū)中的短信。短信中包括發(fā)送方的SIM卡號,數據處理程序據此判斷是否為本系統(tǒng)的有效數據,若是則讀取其中的數據。這種方式既可以運用于“前一后臺”方式,也可以用于RTOS方式。
接收緩沖區(qū)的管理涉及的數據和函數如下:
利用上述方法在MCS-5l系列單片機上成功地利用短信實現了數據傳輸,系統(tǒng)工作穩(wěn)定,占用資源少,未出現信箱堵塞的現象。
評論