日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机

發布時間:2023/12/15 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GSM/GPRS芯片是手機中負責收發短信、撥打電話以及訪問GPRS網絡的核心器件。有方M660+為深圳有方公司生產的一款超小封裝的GSM/GPRS工業無線模塊,可以提供高品質的語音、短信、數據業務等功能,在各種工業和民用領域得到廣泛的應用。

有方M660+ GPRS模塊的硬件設計

硬件設計參考附件《M660+ 硬件設計指南》。

需要注意的幾點:

  • 模塊工作電壓為3.5V~4.3V(推薦值3.9V),不是5V。

  • 模塊平時工作電流較小,但是在模塊注冊網絡或者其他一些特殊情況下,電流可能瞬間達到1.8A,如果電源供電能力不足,電壓瞬間下降嚴重,將可能導致模塊工作異常,沒有信號,無法收發短信等情況。建議采用大電流的開關電源芯片供電,如LM2596 DC-DC轉換模塊;對于移動式設備,采用一塊3.7V鋰離子電池則剛好可以滿足要求;另外應在GPRS模塊供電端附近增加大電容濾波,濾波電容大小見硬件設計指南。

    • 瞬間電流Max 1.8A
    • 平均工作電流 <300mA
    • 待機電流1.5mA typ

  • 該模塊使用3.3V 電平串口,即高電平為3.3V,不是5V,對于5V電平的單片機或TTL串口,為保證工作可靠,不至于燒壞芯片,最好按照硬件設計指南中電路圖搭建電平轉換電路。

  • 單片機系統的硬件設計

    通常使用較多的單片機有51、AVR、MSP430、STM32等。需要根據系統功能,考慮選擇合適的單片機。

    51單片機使用5V電平,且多數型號RAM、ROM較小,運行速度較慢,適合做一些較簡單的應用,優點是簡便易學,且焊接容易(很容易買到使用DIP(直插式)封裝的51單片機)。

    430單片機使用3.3V電平,與GPRS模塊能很好的兼容,且配置相比51更好,最大的特點是低功耗,且性價比較高,適合做不需要處理大量數據(如多媒體信息處理,復雜的人機交互)的多數應用。缺點是大部分430采用貼片封裝,不易于焊接,且使用不當容易燒壞芯片。

    STM32單片機基于ARM7內核,功能強大,功耗較低,性價比很高,但對于只接觸過51一類單片機的人來說,不一定能很好的掌握,因為正是由于功能強大,導致其程序龐大,一些比較簡單的應用不需要使用STM32。STM32適合開發一些需要處理一些圖片、音頻,以及用戶可視化交互的系統。

    總體來說,推薦優先選用MSP430;如果應用比較簡單,可使用51;如果需要一些較為復雜的數據處理,尤其是多媒體信息,可考慮使用STM32、ARM9及以上處理器,或者結合FPFA、DSP來實現。

    有方M660+ GPRS模塊的軟件設計

    從硬件層面來說,有方GPRS模塊僅僅涉及了串口通信,硬件層的編程比較容易。初次接觸GPRS模塊編程時,比較難的是面向AT指令集協議編程(尤其是字符串處理很麻煩),以及如何編寫高效,而又可靠健壯的程序。

    AT指令集是一種可用于GSM/GPRS模塊的通信協議。何謂協議?舉個簡單的例子,我們說話過程中使用的語言,作為大家共同接受的標準,可以在我們之間傳遞信息,這就叫做協議。而串口則是一種接口,接口又是什么呢?接口就是收發信息的實現,我們的嘴巴和耳朵就相當于接口。

    接口和協議又有什么關系呢?串口作為接口,只能一個字節一個字節的傳輸字符,類似的,我們的嘴巴和耳朵原本也只能收發不同的聲音。接口是具體實現,而協議則規定了接口傳輸的信息代表什么含義。如果沒有接口,協議肯定沒法實現,人沒有嘴巴和耳朵是沒法用聲音交流的。另一方面,如果沒有協議,或者協議不兼容,接口的實現也并不能代表什么含義。沒有語言的話,兩個人只是亂叫完全沒法交流;如果兩個人使用不同的語言,而且聽不懂彼此的語言(相當于協議不兼容),也是同樣不能交流的。

    在GPRS模塊軟件的開發中,接口的實現遠比協議實現要簡單。接口的實現在這里就不做介紹,這里主要探討如何編寫高效可靠的程序來實現GPRS模塊的協議即AT指令集。

    完整的AT指令集請參考附件《AT命令手冊》,這里只介紹一些基本用法。

    AT指令集的學習

    要想編寫程序實現AT指令集的功能,就應該先學習AT指令集。如何學習AT指令集呢?一些人會直接給單片機寫程序去控制GPRS模塊的方式學習。事實上,這樣很難學好AT指令集,往往會出現各種錯誤。當你對AT指令集不了解的情況下,盲目的去寫程序,而又并不能保證程序沒有錯誤按設想運行(如果你能保證這一點,那么你就是編程經驗非常豐富的高手了,反正我是做不到這一點),這樣的情況下,實驗失敗時,你根本沒法確定是程序的問題還是AT指令集的問題,甚至有可能是硬件問題等等。

    于是,一般我們將GPRS模塊連接到計算機上來學習AT指令集。對于大多數沒有串口的計算機,你需要有個USB轉TTL串口的轉接線,即使有RS232串口,也需要通過一些轉接芯片進行電平轉換,轉換成TTL串口。注意GPRS模塊TTL串口的電平為3.3V,盡量使用電平轉換電路以免電平不兼容燒壞GPRS模塊。同時,你需要設計好GPRS模塊的供電電路,給其提供一個穩定可靠的電壓。然后插上一張可用的手機SIM卡,連接好電源和串口,GPRS模塊上電后會和手機開機一樣,需要數分鐘的時間搜索信號,然后就可以正常工作。

    電腦端我們使用串口超級終端軟件來調試GPRS模塊。

    當我們從超級終端給GPRS模塊發送“AT”,并按回車時,如果一切正常,屏幕上會顯示返回的“OK”字符,這就是AT指令集最基本的操作:確認AT指令集工作正常。

    通過AT指令集初始化GPRS模塊一般包括以下步驟(前面加“--”符號的表示正常工作返回的字符串,不同模塊不完全一樣,僅供參考,//表示注釋):

  • AT // 確認AT指令集工作正常
  • --OK
  • ATE0 // 關閉回顯(即禁止GPRS模塊發送接收到每一個的字符,在電腦上調試時不需此語句)
  • --OK
  • AT+CPIN // SIM卡準備好?
  • --READY
  • AT+CMGF=1 // 設置短消息格式為Text模式,需在模塊上電一段時間后才能正常返回OK,在此之前會返回ERROR
  • --OK
  • AT+CSMP=17,167,0,0 // 設置Text模式參數,用于短信發送
  • --OK
  • AT+CSCS="GSM" // 設置GSM字符集,用于短信發送
  • --OK
  • AT+CREG? // 網絡注冊完成?應該一直循環發送此句直到網絡注冊完成才能進行短信和電話操作,如果沒有信號,也會返回錯誤信息
  • --+CREG: 0, 1, "341B", "2DBF"
  • 如果需要使用GPRS網絡,也可以在此處初始化,或者在需要使用時才初始化。

    寫程序時發送這些字符串要注意,在每一句結尾處應有一個"\r"結束標志(回車符,ASCII碼中的13,常縮寫為)。對于大部分指令,GPRS模塊接收到此結束符才會執行指令。另外有些引號不可省略,在寫程序時應寫為轉義字符。

    網絡注冊正常后,發送ATD10086,就會給10086打電話,返回OK說明正在嘗試撥打,撥號成功或沒有信號會返回相應字符串。撥號成功,如果連接了話筒和耳機,就能正常通話了。

    發送短信有兩種方式,一種是TEXT模式,另一種是PDU模式,需要先設置好。其中TEXT模式只支持英文(不排除可能有些模塊或者某些特別的方法能使其支持中文),PDU模式支持中文,但編碼方式較為復雜。

    PDU可參考:http://yuanyu5237.iteye.com/blog/1126185

    注:文中提到一個字符ASCII碼中的26(0x1A),在超級終端中可通過Ctrl+Z輸入

    AT指令集協議的編程實現

    要編寫一個高效而又可靠的程序,我們既要向GPRS模塊發送數據,又需要接收返回的數據并判斷返回值是否正確。

    發送數據可以調用串口發送函數直接發送,而接收數據時,需要接收一段完整的字符串。由于單片機可能正在處理其他任務,并不一定能馬上響應接收的指令。編程時我們可以使用環形隊列作為串口接收緩沖區,并在接收到"\r"結束符時置位一個接收標志,然后等待CPU處理。對于一些特殊情形,返回值并不是以"\r"結束,比如發送短信提示輸入短信內容時是以">"結束,此時可以通過延時等待并不斷查詢的方式判斷是否接收到正常的返回值。

    還有一種通過超時判斷是否接收完一條指令的方法,效果相對比較好。當接收到第一個字符時,啟動定時器計時,如果一定時間內接收到下一個字符,清零定時器,再次重新計時……當接收到某個字符之后,計時到超過一定時間仍未收到下一個字符,表明接收完一條指令。因為返回的每條指令都是連續發送出來的,間隔時間固定,所以這種方式能準確判斷指令是否接收完成,缺點是會占用更多硬件資源(需要多用一個定時器)。

    為了充分實現代碼復用,加快程序開發,可以考慮實現這樣幾個函數:

  • // 字符串復制(可使用string.h中的標準函數)
  • void StrCopy(char*, char*);
  • // 判斷一個字符串是否包含另一個字符串
  • unsigned char StrContain(char*, char*);
  • // 發送指令并等待返回指定字符串。注意如果超時仍未返回指定字符串,則應退出函數,以免死機
  • unsigned char SendAndGet(char*, char*);
  • // 發送指令并等待返回指定字符串,嘗試n次
  • unsigned char SendAndGetTimes(char*, char*, unsigned char);
  • // 初始化AT指令集設備,返回初始化是否成功結果
  • unsigned char AT_Init(void);
  • // 發送短信,并返回發送是否成功標志
  • unsigned char SendMsg(char*, char*);
  • // 檢測模塊當前是否有信號
  • unsigned char CheckSignal(void);
  • 一些更復雜的問題

    當先后間隔很短時間發送多條指令,或者是前一條指令需要GPRS模塊使用較長時間去響應時,情況就變得比較復雜了。比如說,我們給出指令發送一條短信,一般可能在10秒左右時間發完,然后返回OK。而在返回OK之前,如果又需要發送另外一條指令,或者很不幸有人打電話來,處理起來就很麻煩了。再比如在間隔很短時間內接收到多條消息,前一條正在處理,后一條消息又被接收到,這個時候怎么保證不遺漏消息呢?我們可以考慮使用隊列來解決這個問題。

    類似這樣的問題很多,尤其對于速度低存儲空間小的單片機來說也不太好解決,而對于一些簡單應用也不一定要考慮這么多情況,本文不做詳細探討。

    附件

    串口超級終端?http://download.csdn.net/detail/jzj1993/5744509
    有方M660+硬件設計指南?http://download.csdn.net/detail/jzj1993/5507753
    AT命令手冊?http://download.csdn.net/detail/jzj1993/5507747

    總結

    以上是生活随笔為你收集整理的GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。