【導(dǎo)讀】設(shè)計(jì)一個(gè)可以實(shí)現(xiàn)短信收發(fā)與數(shù)據(jù)無(wú)線(xiàn)傳輸?shù)哪K的要求,本文采用了ARM Cortex—M3內(nèi)核的主流產(chǎn)品STM32作為主控芯片,采用SIMCom公司的SIM900A作為通信芯片。在查閱大量相關(guān)文獻(xiàn)以及相關(guān)芯片的數(shù)據(jù)手冊(cè)之后,本文設(shè)計(jì)了一個(gè)遠(yuǎn)程無(wú)線(xiàn)通信模塊。該模塊在實(shí)驗(yàn)室試運(yùn)行一周后,沒(méi)有出現(xiàn)掉線(xiàn)的情況,數(shù)據(jù)收發(fā)的速度也很快。該模塊具有性能穩(wěn)定,外形小巧,性?xún)r(jià)比高等優(yōu)點(diǎn)。廠(chǎng)方投入使用之后,反應(yīng)良好。
隨著網(wǎng)絡(luò)和現(xiàn)代通信技術(shù)的不斷發(fā)展,遠(yuǎn)程無(wú)線(xiàn)通信技術(shù)經(jīng)過(guò)多年的研究與實(shí)際應(yīng)用,現(xiàn)如今在工業(yè)控制領(lǐng)域有了非常重要的地位,并且發(fā)揮著越來(lái)越大的作用。文中根據(jù)廠(chǎng)家的要求,設(shè)計(jì)的無(wú)線(xiàn)通信模塊,主要實(shí)現(xiàn)了短信與數(shù)據(jù)收發(fā)功能,并且做到了模塊的穩(wěn)定,掉線(xiàn)之后能夠自動(dòng)重連。
1、無(wú)線(xiàn)通信模塊整體設(shè)計(jì)方案
模塊主要有電源部分、主控部分、通信部分、數(shù)據(jù)傳輸部分4個(gè)部分組成。通信模塊采用SIM900A進(jìn)行無(wú)線(xiàn)通信。主控模塊采用STM32作為主控芯片,來(lái)控制短信的收發(fā)與數(shù)據(jù)傳輸?shù)捻樌M(jìn)行。遠(yuǎn)程終端可以是手機(jī)或者上位機(jī)的數(shù)據(jù)中心軟件,經(jīng)過(guò)處理之后,儲(chǔ)存下來(lái),方便日后的查詢(xún)。本模塊具有低功耗,方便靈活,操作簡(jiǎn)單并且穩(wěn)定,掉線(xiàn)之后可以自動(dòng)連接,運(yùn)行過(guò)程十分穩(wěn)定,并且成本較低。
2、無(wú)線(xiàn)通信模塊硬件設(shè)計(jì)
2.1 功能需求
本文設(shè)計(jì)的無(wú)線(xiàn)通信模塊,要求單12V電源輸入,模塊上電運(yùn)行后有相應(yīng)的指示燈來(lái)指示模塊的運(yùn)行狀態(tài)。另外要求模塊能夠?qū)崿F(xiàn)短信以及數(shù)據(jù)透?jìng)鲀纱笾饕δ?,在手機(jī)發(fā)送短信給模塊之后,模塊能夠動(dòng)作,并給出回應(yīng)。最后要求在建立TCP鏈接時(shí),仍然能夠收發(fā)短信。
圖1 無(wú)線(xiàn)通信模塊結(jié)構(gòu)圖
2.2 電源部分
在主電路中,主控芯片STM32的工作電壓為2.0~3.6 V,通信芯片SIM900A的工作電壓為3.1~4.6 V,為使模塊各個(gè)部分正常工作,必須對(duì)兩者進(jìn)行分別供電,電源供電電路如下:
圖中V12外接12 V電源,經(jīng)過(guò)電容濾波后輸入到LM2576,實(shí)現(xiàn)12 V到4 V的轉(zhuǎn)換,R1、R2在線(xiàn)路中起到分壓作用,D2燈亮起時(shí),表示模塊已經(jīng)正常供電。LM2576是美國(guó)國(guó)家半導(dǎo)體公司生產(chǎn)的3 A電流輸出降壓開(kāi)關(guān)型集成穩(wěn)壓電路,具有完善的保護(hù)電路,比較穩(wěn)定。
圖2 電源模塊
2.3 主控芯片
主控模塊采用STM32單片機(jī)作為微控制器,該芯片能工作于-40~105℃的溫度范圍,MAX3232芯片用于串行口的電平變換,實(shí)現(xiàn)控制器與通信接口之間的通信。串口1與電源電平轉(zhuǎn)換芯片Max3223相連,USART1_TX(輸出,所以在配置GPIO時(shí),定義該口的模式為推拉輸出,USART1_ RX為輸入,定義為懸浮輸入模式。串口2與SN65LBC184D通信,實(shí)現(xiàn)數(shù)據(jù)的收發(fā),USART2_RTS、USART2_RX為輸入端口,模式定義為懸浮輸入模式,USART2_CTS、USART2_TX為輸出端口,模式定義為推拉輸出。串口3用來(lái)控制SIM900A芯片,USART3_RTS、USART3_RX為輸入端口,模式定義為懸浮輸入,USART3_CTS、USART3_TX為輸出端口,模式定義為推拉輸出。
圖3 主控芯片STM32
2.4 通信芯片
通信芯片采用SIMCom公司的新型緊湊型產(chǎn)品SIM900A,它屬于雙頻GSM/GPRS模塊,完全采用SMT封裝形式,性能穩(wěn)定,外觀精巧,性?xún)r(jià)比高,并且能夠滿(mǎn)足用戶(hù)的多種需求。在實(shí)現(xiàn)斷線(xiàn)自動(dòng)重連功能時(shí),涉及到DCD、RI兩個(gè)引腳的使用。DCD引腳用來(lái)實(shí)現(xiàn)模數(shù)轉(zhuǎn)換,當(dāng)模塊掉線(xiàn)時(shí),會(huì)給DCD引腳一個(gè)高電平,當(dāng)這個(gè)電平被DCD引腳檢測(cè)到之后,模塊就是采取相應(yīng)的動(dòng)作,來(lái)重新連接上線(xiàn)。RI引腳在模塊上線(xiàn)之后,就一直保持高電平,在有電話(huà)和短信進(jìn)來(lái)的時(shí)候,RI管腳就會(huì)有一個(gè)低電平出現(xiàn),當(dāng)RI引腳檢測(cè)到這個(gè)低電平的時(shí)候,模塊就會(huì)采取相應(yīng)動(dòng)作,進(jìn)入到短信或者電話(huà)模式。
圖4 SIM900A通信芯片
3 、無(wú)線(xiàn)通信模塊軟件設(shè)計(jì)
3.1 STM32的底層配置
為了實(shí)現(xiàn)STM32單片機(jī)與SIM900A模塊之間的數(shù)據(jù)通信,實(shí)現(xiàn)短信收發(fā)與數(shù)據(jù)傳輸兩大功能。首先要搭建開(kāi)發(fā)平臺(tái),在工程中加入需要用到的庫(kù)函數(shù)以及配置文件,然后配置系統(tǒng)時(shí)鐘、中斷控制器、輸入輸出的GPIO以及相應(yīng)的串口。在配置這些參數(shù)的時(shí)候,首先需要對(duì)照原理圖進(jìn)行編寫(xiě),然后查看芯片用到哪些端口和這些端口的作用,這樣才能保證無(wú)誤。接下來(lái)就要對(duì)各個(gè)部分進(jìn)行配置,以保證模塊能夠正常運(yùn)行。
3.1.1 串口配置
開(kāi)發(fā)環(huán)境搭建好之后,就可以配置端口參數(shù)了。對(duì)于本模塊,設(shè)置USART傳輸?shù)谋忍芈蕿? 600 b/s,字長(zhǎng)為8 bit,1bit停止位,無(wú)檢驗(yàn)?zāi)J?。在?duì)串口1、2、3初始化之后,打開(kāi)串口的中斷響應(yīng)函數(shù):USART_ITConfig(USART1,USART_IT_RXNE,ENABLE)(以串口1為例),使能相應(yīng)的串口:USART_Cmd(USART1,ENABLE),這樣串口的配置就基本完成了。
3.1.2 中斷控制器的配置
首先配置優(yōu)先級(jí)分組,設(shè)置先占優(yōu)先級(jí)1位,從優(yōu)先級(jí)3位。本模塊定義了5個(gè)全局中斷,分別為:兩個(gè)RTC全局中斷、USART1全局中斷、USART2全局中斷、USART3全局中斷,分別對(duì)每一個(gè)中斷配置優(yōu)先級(jí),使能串口再初始化即可。需要注意的是,PC15管腳作為EXTI15的外部中斷輸入管腳,當(dāng)該管腳的電平為低電平的時(shí)候觸發(fā),模塊進(jìn)入短信模式,因此給這個(gè)中斷一個(gè)比較高的優(yōu)先級(jí),所以定義該中斷先占優(yōu)先級(jí)1位,從優(yōu)先級(jí)0位。在設(shè)置優(yōu)先級(jí)的時(shí)候,必須根據(jù)模塊的運(yùn)行情況,選擇最優(yōu)的中斷分組和優(yōu)先級(jí),才能保證程序運(yùn)行時(shí),能夠快速的響應(yīng)中斷。
3.2 無(wú)線(xiàn)通信模塊短信功能的實(shí)現(xiàn)
1) 短信收發(fā)具體過(guò)程
短信功能的實(shí)現(xiàn)主要涉及到兩個(gè)關(guān)鍵部分,一個(gè)是AT命令,另一個(gè)是串口的讀寫(xiě)。AT命令是主控芯片STM32和SIM900A之間的通信協(xié)議,完成對(duì)SIM900A的控制。短信的收發(fā)主要有兩種模式,一種是文本模式,該模式只支持英文內(nèi)容,另一種是PDU模式。本模塊在完成初始化之后,首先通過(guò)USART向SIM900A發(fā)送“AT+回車(chē)”命令來(lái)檢查AT命令是否正常工作,如果返回OK,則表示能夠進(jìn)行接下來(lái)的短信功能。
SIM900A的短信功能主要分為兩個(gè)部分,第一:讀取短消息。讀取短消息的設(shè)置命令為:AT+CMGR,該命令生效后有兩個(gè)返回值:index和mode,index就是接收到的短信的編號(hào),我們將接收到的index內(nèi)容放在一個(gè)長(zhǎng)度為30的buf中,再將buf寫(xiě)入到串口3中,然后再讀取串口3中的內(nèi)容,這樣,短信的編號(hào)就獲取完畢。獲取了短信的編號(hào)之后,就能去獲取短信的具體內(nèi)容,而短信的內(nèi)容則存放在alpha中,它處于響應(yīng)的第三個(gè)位置,通過(guò)get_fw(at_string,phnum,19,2)可將短信的內(nèi)容取出來(lái),這樣短信的內(nèi)容就獲取到了。第二:發(fā)送短消息。發(fā)送短消息的設(shè)置命令為:AT+CMGS,首先將發(fā)送短信的電話(huà)號(hào)碼存入到一個(gè)buf中,將這個(gè)buf寫(xiě)入到串口3中,以此獲取手機(jī)號(hào)碼。而短信在發(fā)送的時(shí)候,短信內(nèi)容之前會(huì)帶一個(gè)“>”號(hào),在程序設(shè)計(jì)時(shí),只要檢測(cè)到“>”號(hào)時(shí),后面的內(nèi)容也就是短信發(fā)送的內(nèi)容,最后將短信的內(nèi)容寫(xiě)到串口3即可。
2)相應(yīng)的AT命令
3.3 短信命令的定義
本模塊自定義了許多短消息命令來(lái)設(shè)置或者查詢(xún)模塊的參數(shù),具體為:SIP:IP地址設(shè)置命令、SPT:端口號(hào)設(shè)置命令、DID:ID號(hào)設(shè)置命令、ACON:自動(dòng)連接命令、PRT:打印命令、LIVE:心跳操作命令、CSQ:信號(hào)強(qiáng)度查詢(xún)命令。這些指令通過(guò)短信的方式來(lái)實(shí)現(xiàn)對(duì)模塊的操作。
拿SIP來(lái)舉例,它的實(shí)現(xiàn)過(guò)程為:首先把短信中的‘=’之前的字符取出來(lái)存放在sms_cmd中,然后將sms_cmd與SIP、SIT、DID、ACON、PRT、LIVE、CSQ來(lái)比較,如果等于其中一個(gè),則程序跳轉(zhuǎn)到相應(yīng)的部分來(lái)執(zhí)行相應(yīng)的操作。這里,strcmp(sms_cmd,“SIP”)==0,程序跳轉(zhuǎn)到SIP部分來(lái)執(zhí)行IP部分的操作。然后,將‘=’之后的字符取出來(lái)存放在sms_para中。通過(guò)字符串比較函數(shù)來(lái)判斷它是‘?’還是數(shù)字。如果是‘?'''',則表示該短信命令是一個(gè)查詢(xún)命令,就只需要用輸出顯示IP號(hào)給用戶(hù)看。如果是數(shù)字,則表示該短信命令是一個(gè)設(shè)置命令,就需要重新設(shè)置某些參數(shù)值,來(lái)改變模塊的運(yùn)行過(guò)程。對(duì)于SIP,如果''''=’之后是數(shù)字,就表示該短信是用戶(hù)用來(lái)設(shè)置模塊的IP地址的。此時(shí),就要把當(dāng)前的IP值賦給模塊的IP值就可以了。最后輸出顯示IP地址設(shè)置成功,則SPT部分的操作就完成了。
4、 無(wú)線(xiàn)通信模塊數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)
4.1 數(shù)據(jù)格式的定義
數(shù)據(jù)包的具體格式如下:
數(shù)據(jù)包頭已經(jīng)定義為S_PACKET_HEADER結(jié)構(gòu)類(lèi)型,link_id為DWORD類(lèi)型,對(duì)于發(fā)送,填寫(xiě)目標(biāo)link_id,對(duì)于接收到的數(shù)據(jù)包,則為源link_id(由服務(wù)器自動(dòng)轉(zhuǎn)換填寫(xiě)),結(jié)束標(biāo)志為0x01,數(shù)據(jù)Data則根據(jù)具體的命令而各不相同。
4.2 登陸、退出的協(xié)議過(guò)程
后臺(tái)軟件根據(jù)指定的服務(wù)器地址和端口號(hào)發(fā)起TCP連接請(qǐng)求,連接成功后開(kāi)始命令交互。工作過(guò)程描述如下:
1)后臺(tái)軟件首先采用CMD_LOGIN命令,登陸到通信服務(wù)器,在登陸成功之前,發(fā)送其他任何命令服務(wù)器都不處理。發(fā)送CMD_LOGIN:FORWARD給服務(wù)器,攜帶數(shù)據(jù)為S_TERMINAL。該命令的目標(biāo)link_id設(shè)為0,表示發(fā)送給服務(wù)器,而不是給其他終端。
2)服務(wù)器在CMD_LOGIN:RESPONSE_OK中將其他在線(xiàn)模塊的信息發(fā)送過(guò)來(lái),從而在客戶(hù)端應(yīng)用程序形成在線(xiàn)模塊列表。后臺(tái)若收到CMD_LO GIN:;RESPONSE_FAILED回應(yīng),則失敗。收到CMD_LOGIN:RESPONSE_OK回應(yīng),則成功,攜帶數(shù)據(jù)為S_TERMINAL。
3)后臺(tái)軟件定時(shí)發(fā)送CMD_KEEP_LIVE命令,以維持鏈路不被網(wǎng)絡(luò)和服務(wù)器終止。每個(gè)在線(xiàn)設(shè)備必須在一定的時(shí)間間隔內(nèi)向服務(wù)器發(fā)送CMD_ KEEP_LIVE信息。服務(wù)器將對(duì)此作檢查,若某設(shè)備在一定的時(shí)間間隔內(nèi)沒(méi)有發(fā)送CMD_KEEP_LIVE信息,則認(rèn)為該設(shè)備已經(jīng)“死亡”,服務(wù)器將斷開(kāi)其連接。
4)后臺(tái)軟件可對(duì)模塊列表中的任意模塊進(jìn)行操控。
5)后臺(tái)軟件退出時(shí),用戶(hù)設(shè)備應(yīng)首先發(fā)送CMD_LOGOFF命令到服務(wù)器,告訴服務(wù)器“我要退出”,該命令的目標(biāo)link_id設(shè)為0。在發(fā)送CMD _LOGOFF:FORWARD給服務(wù)器時(shí),不需要攜帶數(shù)據(jù)。
圖5 登陸,推出的協(xié)議過(guò)程
4.3 數(shù)據(jù)傳輸具體過(guò)程
首先要定義建立TCP連接與關(guān)閉TCP連接的函數(shù),涉及到的AT指令為AT+CIPSTART和AT+CIPCLOSE。建立TCP連接時(shí),先把AT+CIPSTART指令寫(xiě)到串口3中,然后該指令生效后,會(huì)返回一個(gè)“CONNECT”,之后只要檢測(cè)到有返回值“CONNECT”,就表示TCP連接已經(jīng)建立成功。關(guān)閉TCP連接與建立TCP連接類(lèi)似,AT+CIPCLOSE指令生效后會(huì)返回一個(gè)“CLOSE OK”,只要檢測(cè)到“CLOSE OK”,就表示TCP連接已經(jīng)關(guān)閉。
TCP連接建立好以后,透?jìng)髂J骄鸵呀?jīng)被開(kāi)啟,此時(shí)就可以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與讀取。
當(dāng)用戶(hù)要發(fā)送數(shù)據(jù)時(shí),就必須根據(jù)數(shù)據(jù)包的結(jié)構(gòu)來(lái)發(fā)送數(shù)據(jù),首先把包頭寫(xiě)入到串口3中,如果有數(shù)據(jù),則把數(shù)據(jù)內(nèi)容和接收對(duì)象一并寫(xiě)入到串口3中,這樣數(shù)據(jù)的發(fā)送就完成了。
讀取數(shù)據(jù)時(shí),只要有數(shù)據(jù)過(guò)來(lái),就一次一個(gè)字節(jié),把數(shù)據(jù)存放到user_string[i]中,然后i++,再次接收數(shù)據(jù)。
至于數(shù)據(jù)讀取到什么時(shí)候結(jié)束,本程序定義了3種結(jié)束的情況:1)如果用戶(hù)定義了數(shù)據(jù)的長(zhǎng)度,就讀取到最后一個(gè)字節(jié)才結(jié)束。2)如果用戶(hù)沒(méi)有定義數(shù)據(jù)的長(zhǎng)度,就在讀取到回車(chē)符的時(shí)候結(jié)束。3)如果遇到既沒(méi)有已定義的數(shù)據(jù)包長(zhǎng)度,又沒(méi)有讀取到回車(chē)符的情況時(shí),就在數(shù)據(jù)存放的長(zhǎng)度超過(guò)user_string[i]總長(zhǎng)度的四分之三的時(shí)候結(jié)束,或者在超過(guò)100毫秒沒(méi)有數(shù)據(jù)發(fā)過(guò)來(lái)的時(shí)候結(jié)束數(shù)據(jù)的讀取。
4.4 相應(yīng)的AT命令
5 、斷線(xiàn)重連的處理
5.1 TCP鏈接的關(guān)閉和建立
TCP鏈接的建立涉及到的AT命令是at+cipstart,該指令有兩個(gè)返回值,分別是模塊的IP地址和端口號(hào)。首先將at+cipstart指令返回的當(dāng)前模塊的IP地址和端口號(hào)存放到一個(gè)buf中,然后將這個(gè)buf寫(xiě)入到串口3中,如果之后能夠讀取到返回值“CONNECT”,就表示TCP鏈接已經(jīng)建立好。
TCP鏈接的關(guān)閉涉及到的AT命令是at+cipclose,該指令沒(méi)有返回值,可以直接將該指令寫(xiě)到串口3中,如果檢測(cè)到“CLOSE OK”,就表示TCP鏈接已經(jīng)被關(guān)閉。
5.2 DCD的檢測(cè)
當(dāng)TCP建立起來(lái)之后,DCD引腳的電壓值便由高電平變?yōu)榈碗娖?,因此DCD引腳的電平狀態(tài)可以用過(guò)來(lái)指示TCP的連接情況。在程序中,本文設(shè)置時(shí)鐘在檢測(cè)DCD引腳的狀態(tài)值,當(dāng)該引腳的電平值由高電平變?yōu)榈碗娖綍r(shí),就表示模塊模塊已經(jīng)掉線(xiàn),然后模塊就重新開(kāi)始登陸,直到登陸上為止。
5.3 TCP鏈接下的短信收發(fā)
本文定義了一個(gè)全局中斷,當(dāng)有短信或者電話(huà)到達(dá)模塊時(shí),RI引腳的電平便會(huì)由高電平變?yōu)榈碗娖剑藭r(shí)便會(huì)觸發(fā)全局中斷,模塊立即轉(zhuǎn)而處理短信收發(fā)或者數(shù)據(jù)傳輸。
6、 測(cè)試效果
本模塊在設(shè)計(jì)完成之后,在實(shí)驗(yàn)室穩(wěn)定運(yùn)行了2周時(shí)間,沒(méi)有出現(xiàn)什么問(wèn)題。然后又進(jìn)行了特殊情況的測(cè)試,在模塊斷電后恢復(fù)供電,數(shù)據(jù)中心斷電后重新上電的情況下,都能夠重新連接上線(xiàn),并且能夠繼續(xù)穩(wěn)定運(yùn)行。隨后模塊又被送到廠(chǎng)方使用,在被使用了3周之后,廠(chǎng)方反應(yīng)模塊運(yùn)行情況良好,沒(méi)有掉線(xiàn)的情況。
7 、結(jié)論
本文設(shè)計(jì)的無(wú)線(xiàn)通信模塊,是利用STM32來(lái)控制SIM900A芯片,來(lái)實(shí)現(xiàn)短消息的收發(fā)與數(shù)據(jù)的無(wú)線(xiàn)傳輸。本設(shè)計(jì)完成了無(wú)線(xiàn)通信的硬件部分和軟件部分的設(shè)計(jì)與實(shí)現(xiàn)。在多次運(yùn)行試驗(yàn)時(shí),本模塊沒(méi)有出現(xiàn)掉線(xiàn)以及發(fā)熱等問(wèn)題,非常穩(wěn)定。本次設(shè)計(jì)成本較低,運(yùn)行穩(wěn)定可靠,應(yīng)用范圍十分廣泛,利用SIM900A,降低了模塊的成本,使其更加具有商業(yè)價(jià)值。
(作者:霍濤,賈振堂,上海電力學(xué)院電子與信息工程)
推薦閱讀: