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