單片機控制GPS/GSM原理(虛擬串口)
在遠程目標定位中,需要將利用GPS技術(shù)獲得的遠程目標的定位信息發(fā)送到監(jiān)控中心。這可利用無線電臺進行發(fā)送,但是該方法容易受到干擾而且還受到電臺通信距離的限制。隨著移動通信的發(fā)展和GSM網(wǎng)絡(luò)的廣泛覆蓋,GSM短消息業(yè)務(wù)也得到廣泛應(yīng)用,利用短消息服務(wù)來傳輸GPS定位數(shù)據(jù)是具有優(yōu)勢的。GSM網(wǎng)絡(luò)容量大,通信盲區(qū)少,利用該方法不僅可以克服傳輸距離的限制,而且相當方便、可靠,費用也十分低廉。結(jié)合GSM網(wǎng)絡(luò)作為數(shù)據(jù)傳輸方式的各種優(yōu)點和GPS這一成熟的定位技術(shù),本文研究并實現(xiàn)了一種利用較少的資源就可實現(xiàn)的基于虛擬串口的GPS/GSM遠程定位技術(shù)。
本文引用地址:http://m.butianyuan.cn/article/201611/315390.htm1 系統(tǒng)架構(gòu)
系統(tǒng)構(gòu)成框圖如圖1所示。在遠程目標端,單片機通過GPS模塊獲取有用的信息,如經(jīng)緯度、時間、速度等信息,定時的以短消息的形式操控GSM短消息模塊發(fā)送定位數(shù)據(jù)給監(jiān)控中心。在監(jiān)控中心部分,采用一個GSM模塊與PC機通信,編寫一個PC上的軟件實現(xiàn)收發(fā)短消息、撥打電話、保存短消息等功能,并顯示出遠程目標定位信息。同時,通過撥打遠程目標處TC35i模塊的電話可實現(xiàn)系統(tǒng)的一些擴展功能。
1.1 GPS模塊
GPS模塊采用的是Navman公司的Jupiter 21OEM板,它具有12通道,體積小、重量輕、功耗低;定位迅速準確,抗干擾性能突出;操作簡便、易于開發(fā),可通過串口與PC機進行通訊??梢愿鶕?jù)通信的波特率選擇輸出NMEA-0183語句格式或者SIRF二進制格式的定位信息,默認情況下輸出為NMEA-0183語句格式。該模塊還具有1 PPS秒脈沖輸出,且精度優(yōu)于1μs,在本系統(tǒng)設(shè)計中用對1 PPS秒脈沖計數(shù)的方法很好地實現(xiàn)了收發(fā)短信的定時。
1.2 GSM短消息模塊
GSM短消息模塊采用的是SIEMENS公司的TC35i模塊,這是一個支持中文短消息的工業(yè)級GSM模塊,工作在EGSM 900和GSM 1800雙頻段,電源范圍為3.3~5.5 V,可傳輸語音和數(shù)據(jù)信息,可以利用AT命令通過接口電路對其進行控制。TC35i模塊支持以TEXT模式和PDU模式發(fā)送短消息,使用TEXT模式發(fā)送短消息代碼簡單,容易實現(xiàn),但不能收發(fā)中文短信,而PDU格式實現(xiàn)較復雜,但可以收發(fā)中文短信。系統(tǒng)設(shè)計中處于簡單且能滿足系統(tǒng)需要考慮,采用的TEXT模式收發(fā)短消息。
1.3主控單元
主控單元采用AT89S52單片機作為控制器,單片機通過串口與GPS模塊以及GSM模塊進行通信。在此需要兩個串口,而AT89S52單片機本身只有一個串口,常規(guī)的解決方法是采用具有雙串口的單片機或者ARM等控制器,或者通過硬件來擴展串口。前者會使系統(tǒng)的硬件成本大大提高,而后者不僅會增加系統(tǒng)的成本,還會增大系統(tǒng)硬件的體積。本文采取的解決辦法是,AT89S52單片機本身的串口用于跟GPS模塊進行通信,而利用I/O口P1.4和P3.2編程實現(xiàn)一個虛擬串口與TC35i模塊進行通信。由于單片機內(nèi)部定時/計數(shù)器只能實現(xiàn)較小時間的定時,所以巧妙利用了單片機的T2定時/計數(shù)器(P1.0)對Jupiter 21 OEM板的1 PPS秒脈沖輸出進行計數(shù)方便地實現(xiàn)5 min定時,用于收發(fā)短信所需的定時。該部分還擴展了報警電路和控制開關(guān)通斷等功能電路,這是由監(jiān)控中心通過撥打遠程目標端的電話來控制的。同時,還保留了單片機的剩余I/O口用于系統(tǒng)的進一步擴充。
2系統(tǒng)軟件設(shè)計
2.1單片機部分軟件設(shè)計
單片機部分的程序流程圖如圖2所示。該部分程序采用C語言編程實現(xiàn),主要包括定位信息的提取、虛擬串口通信以及短消息的發(fā)送三個部分。
2.1.1 定位信息的提取
單片機采用4 800 b/s波特率與GPS模塊進行異步串行通訊,從GPS模塊輸出的是NMEA-01183語句格式的數(shù)據(jù)。該語句格式的數(shù)據(jù)以“$”開頭,包括$GPRMC,$GPGGA,$GPGSV,$GPVTG,$GPGSA,$GPGLL等語句。系統(tǒng)設(shè)計中只從中提取出$GPRMC語句,再進一步提取出里面包含的經(jīng)緯度、速度、時間等信息,已經(jīng)可以滿足系統(tǒng)的需求。該部分的軟件流程圖如圖3所示。
2.1.2 虛擬串口
單片機與GSM模塊之間通過虛擬串口.進行通信,以解決AT89S52單片機固有串口不足的問題,通信波特率取為9 600 b/s。虛擬串口就是利用單片機I/O編程實現(xiàn)一個串口的功能,這樣就以較少的資源實現(xiàn)了系統(tǒng)的功能,克服了傳統(tǒng)的采用具有雙串口的控制器或者利用硬件進行串口擴展的方法其成本高、體積大的缺點。程序中采用定時器工作于方式2進行一個數(shù)據(jù)位傳輸時間的定時,用于嚴格控制一個數(shù)據(jù)位的傳輸時間。單片機采用11.059 2 MHz晶振,這樣定時器的初值為256—(1 000 000/9 600)/(12/11.059 2)=160,即十六進制的0xA0。實驗結(jié)果證明,采用該方法進行串口通訊,數(shù)據(jù)傳輸穩(wěn)定、可靠。采用虛擬串口發(fā)送、接收一個字符的程序流程圖分別如圖4,圖5所示。
2.1.3發(fā)送短消息
主要是由單片機根據(jù)發(fā)送短消息的特定步驟,采用AT命令控制GSM模塊發(fā)送短消息,是系統(tǒng)設(shè)計中最重要的內(nèi)容之一。該部分程序設(shè)計中,由于會涉及到單片機與GSM模塊的多次交互過程,而GSM模塊響應(yīng)較單片機來的慢,特別是涉及到FLASH或SIM卡的操作及網(wǎng)絡(luò)的交互時,必須要考慮到GSM模塊的響應(yīng)時間問題。系統(tǒng)中采用TEXT模式發(fā)送短消息,步驟如下:
2.2監(jiān)控中心軟件設(shè)計
至此,英文短信發(fā)送成功,此過程中若模塊回復出現(xiàn)ERROR則短信發(fā)送不成功。以上步驟1,3,4經(jīng)設(shè)置后無需再設(shè)置,步驟2在模塊斷電時需重設(shè),步驟5,6在每次發(fā)送短消息時都要重復進行。
在監(jiān)控中心的PC機上采用VB結(jié)合ACCESS數(shù)據(jù)庫設(shè)計一個監(jiān)控軟件,該軟件通過串口與GSM模塊進行通信,獲取遠程目標的定位信息,經(jīng)過進一步處理后顯示出來。由于電子地圖制作復雜、價格較貴,所以本系統(tǒng)示意性的利用由Google Earth軟件上截圖出來的圖片作為電子地圖,用于直觀地顯示出遠程目標的具體位置。ACCESS數(shù)據(jù)庫用于保存收發(fā)短消息的內(nèi)容,該軟件還具有撥打電話等功能。
3實驗結(jié)果及分析
利用該軟件進行實驗得到的結(jié)果如圖6所示。圖中左半部分是軟件的實現(xiàn)界面,右半部分是以GoogleEarth軟件截圖出來的圖片作為虛擬的電子地圖來示意性的說明問題。實驗中,GPS天線置于福州大學旗山校區(qū)電氣學院樓頂,監(jiān)控中心位于電氣學院南303實驗室。由圖中左半部分可以看到目標最近一次的定位信息:定位時間:10:28:28;緯度:26°043.03N;經(jīng)度:119°1142.57E;速度:0.048 m/s。右半部分圖中的紅、綠、藍小圓圈代表近三次實驗獲得的定位位置結(jié)果(在地圖上幾乎重合,為說明位置在圖中進行引出標注),紅色小圓點代表天線的真實位置(在圖中也進行引出標注說明),Google Earth軟件中的地標,用GoogleEarth軟件的測距工具測得實驗結(jié)果與天線真實位置的誤差約為12 m,這主要由GPS模塊的定位精度所決定。
由實驗結(jié)果可以看出,定位位置結(jié)果基本一致,但經(jīng)緯度、速度存在很小的零漂移,這是正常的,零漂移的大小取決于GPS模塊的性能。經(jīng)過長期實驗證實,系統(tǒng)穩(wěn)定、可靠,定位誤差較小,基本上可滿足一般的應(yīng)用要求。若要應(yīng)用于對定位精度要求較高的場合,可以考慮采用定位精度更高的GPS模塊等措施。
4結(jié) 語
實驗結(jié)果表明,系統(tǒng)運行穩(wěn)定、可靠,可以實現(xiàn)無距離限制的遠程定位。由于采用了虛擬串口技術(shù),所以以較少的資源實現(xiàn)了GPS/GSM遠程定位技術(shù),該定位技術(shù)可以應(yīng)用于進行遠程定位的多種領(lǐng)域。但是,由于作為定位數(shù)據(jù)傳輸網(wǎng)絡(luò)的GSM網(wǎng)絡(luò)的固有問題,對系統(tǒng)的實時性有一定的影響。比如,有時會出現(xiàn)收發(fā)短消息延時的問題,特別是在網(wǎng)絡(luò)擁擠的時候,有時還存在較小區(qū)域的通信盲區(qū),可以考慮與運營商建立一條專用短消息傳輸通道來保證遠程定位信息的可靠傳輸。相信隨著定位技術(shù)、通信技術(shù)以及GIS技術(shù)的不斷發(fā)展,本文所討論的遠程定位技術(shù)將會得到廣泛的應(yīng)用。
傳統(tǒng)的通信方式主 要有短波通信、衛(wèi)星通信和超短波通信[1]。短波通信由于其固有缺 點且受氣候的影響大,在實時采集數(shù)據(jù)傳輸系統(tǒng)用中很少采用。衛(wèi)星通信的傳輸質(zhì)量好,傳 輸距離不受限制,覆蓋面積大,受地形、氣候的影響小,組網(wǎng)靈活,但目前運行費用偏高。 超短波通信的信號傳輸比較穩(wěn)定,質(zhì)量較好,又具有一定的繞射能力,是我國目前應(yīng)用最多 、技術(shù)上也比較成熟的通信方式,但屬于視距傳輸,且受地形限制,在山地通信時需要設(shè)置 中繼站,這樣會增加成本。
實時采集數(shù)據(jù)傳輸頻率較高,但數(shù)據(jù)信息量小。GSM(Global System for Mobile Commu nications)網(wǎng)絡(luò)當中的短消息服務(wù)(SMS,Short Messaging Service)適合于實時采集數(shù)據(jù) 的傳輸。目前一條短消息的信息量限制為140個字節(jié)[2],短消息業(yè)務(wù)可以被認為 是GSM 系統(tǒng) 中最為簡單和方便的數(shù)據(jù)通訊方式,它無需附加龐大和昂貴的數(shù)據(jù)終端設(shè)備,僅使用GSM模 塊就可以達到互相進行通信的目的。再一個優(yōu)點就是由于利用了現(xiàn)有的網(wǎng)絡(luò),用戶無需另外 組網(wǎng),所以節(jié)省了昂貴的組建網(wǎng)費用和維護費用,同時,對用戶的數(shù)量沒有任何限制。
1 硬件電路及工作原理
GSM模塊采用WAVECOM公司推出的wism02c,支持AT指令。單片機采用AT89C51。
GSM模塊數(shù)據(jù)線是專為連接PC機9針串口而設(shè)計的,①信號電平為標準的RS232電平, 只要單片機的串口也轉(zhuǎn)換為RS232電平,就可直接連接。②9針串口的引腳定義是固定的, 即2腳為TXD(GSM模塊發(fā)送)、3腳為RXD(GSM模塊接收)、5腳為GND。這樣直接連接這幾個線也 可以。單片機輸出的是TTL電平,即0~+5v的電壓,而RS232輸出的是-20V~20V的電壓。所 以不能直接連接,需要一個電壓轉(zhuǎn)換芯片MAX232。如圖1所示。
單片機利用AT指令控制GSM模塊,將數(shù)據(jù)傳送出去。AT指令按照GSM模塊支持的AT指令 格式書寫,通過單片機的串口發(fā)送出去。
740)this.width=740" border=undefined zoom_img(event,this)">
2 SMS
短消息(Short Message ,SM)是GSM網(wǎng)絡(luò)系統(tǒng)的主要增值業(yè)務(wù)之一,短消息接收和發(fā)送的 業(yè)務(wù)代碼分別為T21和T22。申請了短消息服務(wù)的用戶,在手機上設(shè)置短消息中心號碼后即可 發(fā)送短消息,接收短消息無需任何設(shè)置。一條短消息的最大長度可為160個英文字符(7位編 碼)或70個漢字(16位編碼)。短消息是通過控制信道傳輸?shù)模徽紭I(yè)務(wù)信道,在通話的同時 也可以接收短消息。
按短消息發(fā)送的方式可分為:塊模式(Block Mode)、文本模式(Text Mode)和pdu 模式。
2.1 塊模式(BLOCK Mode)
塊模式是一個二進制協(xié)議,用于移動臺和SMSC之間的 短消息傳輸?shù)腜DU(Protocol Description Unit)封裝。
2.2 文本模式(TEXT Mode)
文本模式是在為GSM修改的AT指令集的基礎(chǔ)上定義的基于字符的 協(xié)議。適合非智能終端或終端仿真器。應(yīng)用軟件把純文本消息傳給GSM模塊,由GSM模塊來構(gòu) 造TPDU(Transfer Protocol Data Unit ,傳輸協(xié)議數(shù)據(jù)單元)。文本模式提供的功能比塊 模式和PDU模式提供的功能少。在文本模式下,短消息對擴展字符的能力是有限的。
2.3 PDU模式(PDU Mode)
PDU模式和文本模式很相似,主要的區(qū)別是它將組裝短消息的任務(wù) 留給應(yīng)用系統(tǒng)完成。該模式使AT指令集能方便地組構(gòu)更多復雜的PDU,例如既可以傳遞二進 制數(shù)據(jù)又可以傳送字符數(shù)據(jù)。這種模式給AT指令集帶來了方便。
本系統(tǒng)可發(fā)送文本模式和pdu模式的短消息。
3 AT指令
AT命令集是從TE(Terminal Equipment,終端設(shè)備)或DTE(Data Terminal .Equipmen t,數(shù)據(jù)終端設(shè)備)向TA(Terminal Adapter,終端適配器 )或DCE(Data Circuit Termin ating Equipment)發(fā)送的。通過TA、TE發(fā)送AT 命令來控制MS(Mobile Station,移動基 站)的功能與GSM網(wǎng)絡(luò)業(yè)務(wù)進行交互[5]。短消息相關(guān)的主要AT指令有[6]:
* AT+CMGF:選擇短消息信息格式:0-PDU;1-文本
* AT+CMGS:發(fā)送短消息
* AT+CMGD:刪除SIM卡內(nèi)存的短消息
* AT+CMGR:讀短消息
以下是發(fā)送AT指令的步驟(發(fā)送的數(shù)據(jù)都應(yīng)該采用ASCII碼):
3.1 選擇短消息格式
AT+CMGF=1
1為選擇text mode;0為選擇PDU mode;
3.2 以文本模式發(fā)送短消息
AT+CMGS=<手機號碼>
例如:對方號碼是13947178096,消息內(nèi)容是:123
則AT指令串是:A,T,+,C,M,G,S,=,0X22,0X31,0X33,0X39,0X34,0X37 ,0X31,0X37,0X38,
0X30,0X39,0X36,0X22,0X0D,0X0A,0x31,0x32,0x33,0x1a
3.3 以pdu模式發(fā)送短消息
SMSC(短信中心)號碼是+8613800471500,對方號碼是13947178096,消息內(nèi)容是:“ 水位”。則手機發(fā)送的PDU串是08 91 68 31 08 40 17 05 F0 11 00 0D 91 68 31 49 17 87 90 F6 00 08 00 06 6C344F4D。
4 軟件仿真
4.1 keil c 與proteus的連接[4]
①檢測TCP/IP(該協(xié)議一般沒有問題,只要網(wǎng)絡(luò)連接正確即可)。
②復制Proteus安裝目錄下MODELS文件夾里的vdm51.dll到keil c/c51/BIN目錄下。
③修改Keil/c51/TOOLS中[c51]的內(nèi)容,添加:TDRV4=BIN VDM51.DLL(“PROTEUS VSM MO NITOR 51 DRIVER”)。
④在keil c中選擇proteus仿真器。
⑤在proteus中選擇Debug下的Use Remote Debug Monitor。
4.2 單片機串口通信
單片機晶振頻率為11.0592MHz,選擇串行模式1,所以波特率為9600Kbit/s[7]。單片機 采用查詢的方式發(fā)送數(shù)據(jù),如果AT指令格式正確,GSM模塊返回應(yīng)答信息給單片機。將程序 繞錄到單片機之前,可以利用超級終端和GSM模塊的通信確定AT指令的格式。
4.3 發(fā)送短信仿真圖
圖3為用文本模式發(fā)送內(nèi)容“123”到手機號碼13947178096的仿真圖。
圖4為用pdu模式發(fā)送短信“水位”到手機號碼13947178096的仿真圖。
740)this.width=740" border=undefined zoom_img(event,this)">
單片機與GSM之間的通信調(diào)試成功。
------------------------------------全局變量聲明---------------------------------------
Dim portno As Integer 端口號
Dim baudrate As Long 波特率
Const prex = "0891" 定義全局靜態(tài)變量
Const midx = "0011000D91"
Const sufx = "000801"
Private Const EM_LINESCROLL = &HB6
----------------------------------------------------------------------------------------
發(fā)送信息
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As
Any) As Long
-----Sleep函數(shù)(延時功能)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
GetWindowTextW 指明這是一個 Unicode API (ASSII<->unicode)
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextW"
(ByVal hwnd As Long, ByVal lpString As Long, ByVal cch As Long) As
LongText2.Text = StrConv(StrConv(Text1.Text, vbUnicode),
vbFromUnicode)Private Sub NewSMSeting() 檢測新信息
If Mobcomm.PortOpen = False Then
Mobcomm.PortOpen = True
End If
Mobcomm.Output = "AT+CNMI=1,1,0,0,1" + vbCr
Timer2.Enabled = True
End Sub
Private Function telc(num As String) As String 把電話號碼轉(zhuǎn)換成Unicode碼
Dim tl As Integer
Dim ltem, rtem, ttem As String
Dim ti As Integer
ttem = ""
tl = Len(num)
If tl <> 11 And tl <> 13 Then
MsgBox "電話號碼有誤!" & tl
Exit Function
End If
If tl = 11 Then
tl = tl + 2
num = "86" & num
End If
For ti = 1 To tl Step 2
ltem = Mid(num, ti, 1)
rtem = Mid(num, ti + 1, 1)
http://www.lwfree.com/ As Integer
Dim r As String
For i = 1 To Len(s) Step 4
r = r + ChrB("&H" & Mid(s, i + 2, 2)) & ChrB("&H" & Mid(s, i, 2))
Next
Unicode2AscII = r
End Function
Public Function AscII2Unicode(ByVal CS As String) 把信息轉(zhuǎn)換成Unicode碼
Dim Length As Integer
Dim temp As String
Dim i As Integer
Dim tempO As String
Dim tempN As String
tempN = ""
tempO = CS
Length = Len(tempO)
For i = 1 To Length
If AscW(Mid(CS, i, 1)) >= 0 And AscW(Mid(CS, i, 1)) < 128 Then
temp = "00" & Hex(AscW(Mid(CS, i, 1)))
Else
temp = Hex(AscW(Mid(CS, i, 1)))
End If
tempN = tempN & temp
Next i
AscII2Unicode = Trim(tempN)
End Function
Private Function ConTelc(teln As String) 電話號碼譯碼
Dim i As Integer
Dim ltem, rtem, ttem As String
ttem = ""
For i = 1 To 14 Step 2
ltem = Mid(teln, i, 1)
rtem = Mid(teln, i + 1, 1)
If i = 13 Then ltem = ""
ttem = ttem & rtem & ltem
Next i
ConTelc = "+" + ttem
End Function
Private Function ConTimec(times As String) 時間譯碼
Dim Timetem As String
Timetem = Mid(times, 2, 1) + Mid(times, 1, 1) + "/" + Mid(times, 4, 1) +
Mid(times, 3, 1) + "/" _
+ Mid(times, 6, 1) + Mid(times, 5, 1) + " " + Mid(times, 8, 1) +
Mid(times, 7, 1) + ":" + _
Mid(times, 10, 1) + Mid(times, 9, 1) + ":" + Mid(times, 12, 1) +
Mid(times, 11, 1)
ConTimec = Timetem
End Function
Private Sub SMSend(ML As Integer, MS As String) 信息發(fā)送函數(shù)
Dim Backstring As String
If Mobcomm.PortOpen = False Then
Mobcomm.PortOpen = True
End If
Mobcomm.InBufferCount = 0
Mobcomm.OutBufferCount = 0
Mobcomm.InputLen = 0
Backstring = ""
Sleep (100)
Mobcomm.Output = "AT+CMGF=0" + vbCr
Sleep (400)
If Mobcomm.InBufferCount > 0 Then
Backstring = Mobcomm.Input
Mobcomm.InBufferCount = 0
Mobcomm.OutBufferCount = 0 1116
If InStr(Backstring, "OK") Then
Mobcomm.Output = "AT+CMGS=" + Str(ML) + Chr(13) + Chr(10)
Else
GoTo err
Exit Sub
End If
Backstring = ""
End If
Sleep (400)
If Mobcomm.InBufferCount > 0 Then
Backstring = Mobcomm.Input
Mobcomm.InBufferCount = 0
Mobcomm.OutBufferCount = 0
If InStr(Backstring, ">") Then
Mobcomm.Output = MS + Chr(26)
Else
GoTo err
Exit Sub
End If
Backstring = ""
End If
Sleep (2000)
If Mobcomm.InBufferCount > 0 Then
Backstring = Mobcomm.Input
Mobcomm.InBufferCount = 0
Mobcomm.OutBufferCount = 0
If InStr(Backstring, "OK") Then
MsgBox "信息發(fā)送成功!", vbOKOnly, "系統(tǒng)提示"
Else
GoTo err
Exit Function
End If
Backstring = ""
End If
Sleep (1000)
Exit Sub
err:
MsgBox "信息發(fā)送成功!", vbOKOnly, "系統(tǒng)提示"
MsgBox "傳送出現(xiàn)錯誤,請重新發(fā)送!", vbOKOnly, "系統(tǒng)提示"
End Sub
Private Function Sendsms(num As String, msg As String) As Boolean 短信發(fā)送
Dim PDU, psmsc, pnum, pmsg, buf As String
Dim Leng As String
Dim Length As Integer
Length = Len(msg)
Length = 2 * Length
Leng = Hex(Length)
If Length < 16 Then Leng = "0" & Leng
psmsc = Trim(telc("8613800758500"))
pnum = Trim(telc(num))
pmsg = Trim(StrConv(msg, vbUnicode))
PDU = prex & psmsc & midx & pnum & sufx & Leng & pmsg
Sleep (1)
Call Portopen_Test
Mobcomm.Output = "AT+CMGF=0" + vbCr
Mobcomm.Output = "AT+CMGS=" & Str(15 + Length) + vbCr
Sleep (500)
If Mobcomm.InBufferCount > 0 Then
Mobcomm.InputLen = 0
buf = Mobcomm.Input
If InStr(buf, ">") Then
Mobcomm.Output = PDU & Chr$(26)
buf = ""
End If
End If
If Mobcomm.InBufferCount > 0 Then
Mobcomm.InputLen = 0
buf = Mobcomm.Input
If InStr(buf, "OK") Then
buf = ""
Sendsms = True
End If
End If
End Function
Private Sub readsms(rnum As String) 接收信息
Mobcomm.Output = "AT+CMGF=1" + vbCr
Mobcomm.Output = "AT+CMGR=" & rnum + vbCr
End Sub
Private Sub Command1_Click()
myActiveX.Active = False
myActiveX.ComPort = Combo1(1).Text
myActiveX.baudrate = Int(Val(Combo2(1).Text))
MsgBox "設(shè)置端口號為:" & Combo1(1).Text & ",波特率為:" & Combo2(1).Text & tl
myActiveX.Active = True
End Sub
Private Sub Command2_Click()
msg.Text = ""
End Sub
Private Sub Command3_Click()
DebugText "================= SIM卡信息 ====================="
DebugText " SIM卡IMSI: " + myActiveX.IMSI
DebugText " 短信中心: " + myActiveX.SCA
DebugText " 所屬網(wǎng)絡(luò): " + myActiveX.Provider
DebugText " 短信數(shù)目: " + myActiveX.SMSMemUsed
DebugText " 短信容量: " + myActiveX.SMSMemTotal
= 0
Mobcomm.InputLen = 0
Sleep (100)
Mobcomm.Output = "AT+CMGF=1" + vbCr
Sleep (400)
Mobcomm.InBufferCount = 0
Mobcomm.Output = "AT+CMGD=" + index.Text + Chr(13) + Chr(10)
Sleep (400)
mobcomm.OutBufferCount = 0
mobcomm.Output = "13138529082" + vbCr
If Mobcomm.InBufferCount > 0 Then
Instring = Mobcomm.Input
If InStr(Instring, "OK") Then
MsgBox "成功刪除第" + index.Text + "條信息!", vbOKOnly, "提示"
Else
MsgBox "信息刪除不成功!"
End If
End If
rmsg.Text = Mid(Instring.Text, 1, InStr(Instring, Chr(13) + Chr(10)))
rmsg.Text = Unicode2AscII(stringdeal(Instring))
rmsg.Text = Mid(Instring, 11)
Sleep (100)
mobcomm.OutBufferCount = 0
mobcomm.Output = Text1.Text + Chr(26)
Sleep (100)
End If
If InStr(Instring, "OK") Then
End If
If Mobcomm.PortOpen = True Then
Mobcomm.PortOpen = False
End If
myActiveX.Active = True
If Mobcomm.PortOpen = False Then
Mobcomm.PortOpen = True
End If
Mobcomm.Output = "AT+CMGD=" & index.Text + vbCr
Sleep (300)
If Mobcomm.InBufferCount > 0 Then
Mobcomm.InputLen = 0
temp$ = Mobcomm.Input
Mobcomm.InBufferCount = 0
If InStr(buf, "OK") Then
MsgBox "該信息已刪除!"
Else
MsgBox "信息刪除不成功!"
End If
End If
End Sub
Private Sub Form_Load()
Combo1(1).ListIndex = 0 選擇端口和波特率
Combo2(1).ListIndex = 4
myActiveX.Active = True 打開模塊
End SubPrivate Sub msgsend_Click()
Dim MsgAdr As String
Dim TelNo As String
Dim Smsg As String
Dim PDU As String
Dim Leng As String
Dim Length As Integer
Dim AllLength As Integer
Length = 2 * Len(msg.Text)
Leng = Hex(Length)
If Len(Leng) = 1 Then
Leng = "0" & Leng
End If
AllLength = 15 + Length
MsgAdr = Trim(telc("8613800758500")) 肇慶動感地帶短信信中心地址
TelNo = Trim(telc(teln.Text)) 手機號碼
Smsg = Trim(AscII2Unicode(msg.Text)) 短信息內(nèi)容
PDU = midx & TelNo & sufx & Leng & Smsg
PDU = "0011000D91683167006059F100080108828265E55FEB4E50"
AllLength = 23
myActiveX.Active = False
If Mobcomm.PortOpen = False Then
Mobcomm.PortOpen = True
SMSend AllLength, PDU 調(diào)用短信息發(fā)送程序
End If
If Mobcomm.PortOpen = True Then
Mobcomm.PortOpen = False
myActiveX.Active = True
End If
myActiveX.SendTextSMS Trim(teln.Text), Trim(msg.Text)
If Sendsms(Trim(teln.Text), Trim(msg.Text)) = True Then
If Sendsms = True Then
MsgBox "信息發(fā)送成功!"
End If
End Sub
Private Function stringdeal(ByVal st As String)
stringdeal = Mid(st, InStr(st, Chr(10)) + 16)
End Function
Private Sub rm_Click() 閱讀信息
Dim N As Integer
Dim Instring As String
= 0
Mobcomm.InputLen = 0
Sleep (100)
Instring = ""
Mobcomm.Output = "AT+CMGF=0" + vbCr
Sleep (400)
If Mobcomm.InBufferCount > 0 Then
Instring = Mobcomm.Input
Mobcomm.InBufferCount = 0
Mobcomm.OutBufferCount = 0
If InStr(Instring, "OK") Then
Mobcomm.Output = "AT+CMGR=" + index.Text + Chr(13) + Chr(10)
End If
Instring = ""
End IfSleep (500)If Mobcomm.InBufferCount > 0 Then
Instring = Mobcomm.Input
SMSdeal Instring
Sleep (100)
If InStr(Instring, "OK") Then
MsgBox "成功讀取第" + index.Text + "條信息!", vbOKOnly, "系統(tǒng)提示"
Else
MsgBox "該信息為空!", vbOKOnly, "系統(tǒng)提示"
End If
Instring = ""
End If
If Mobcomm.PortOpen = True Then
Mobcomm.PortOpen = False
myActiveX.Active = True
End If
End Sub
Private Function SMSdeal(SMS As String)
On Error Resume Next
Dim SM As String
Dim SN As String
Dim STIME As String
Dim SMG As String
Dim SLONG, N As Integer
If InStr(SMS, "0891") Then
SM = Mid(SMS, InStr(SMS, "0891"))
SN = ConTelc(Mid(SM, 25, 14))
STIME = ConTimec(Mid(SM, 43, 14))
SLONG = CInt(Mid(SM, 57, 2))
N = SLONG * 4
SMG = Unicode2AscII(Mid(SM, 59, N))
rmsg.Text = " 短信類型: " + "已讀信息" + vbCr + vbLf + " 對方號碼: " + SN + vbCr
+ vbLf + " 發(fā)送時間: " _
+ STIME + vbCr + vbLf + " 短信長度: " + Str(SLONG / 2) + "字節(jié)" + vbCr +
vbLf + " 信息內(nèi)容:" + SMG + vbCr + vbLf
ElseIf InStr(SMS, "018") Then
SM = Mid(SMS, InStr(SMS, "018"))
SLONG = CInt(Mid(SM, 17, 2))
N = SLONG * 4
SMG = Unicode2AscII(Mid(SM, 19, N))
rmsg.Text = " 短信類型: " + "存儲信息" + vbCr + vbLf + " 信息內(nèi)容:" + SMG + vbCr
+ vbLf
End If
End Function
Private Sub rpb_Click()
myActiveX.ReadPhoneBook "1", myActiveX.PhoneBookCount
End Sub
Private Sub Timer1_Timer()
Dim buf As String
If Mobcomm.InBufferCount > 0 Then
Timer1.Enabled = False
Mobcomm.InputLen = 0
buf = Mobcomm.Input
If InStr(buf, "OK") = 0 Then
MsgBox "端口打開有誤!" & tl
End If
End If
End Sub
Private Sub Timer2_Timer()
If Mobcomm.InBufferCount > 0 Then
MsgBox "你有新的信息,請查收!"
If IntChk$ = vbOK Then
Mobcomm.InputLen = 0
buf$ = Mobcomm.Input
Timer2.Enabled = False
remsg$ = StrConv(buf, vbFromUnicode)
DebugText remsg 信息顯示函數(shù)
End If
End If
End Sub
Private Sub DebugText(Str) 設(shè)定輸出格式
rmsg.Text = rmsg.Text + Str + Chr(13) + Chr(10) 輸出消息
SendMessage rmsg.hwnd, EM_LINESCROLL, 0, 1 向下卷行
End Sub
Private Sub myActiveX_OnNewSMS(ByVal ReadState As String, ByVal sDateTime
As String, ByVal sNum As String, ByVal sText As String, ByVal sSCA As
String)
收到新消息
DebugText "================= 收到新消息 ==================="
DebugText "時間日期: " + sDateTime
DebugText "電話號碼: " + sNum
DebugText "消息內(nèi)容: " + sText
DebugText "================================================"
MsgBox "收到新消息:" + sNum
End Sub
Private Sub myActiveX_OnPhoneBookList(ByVal PhoneBook As String)
phbook.Text = PhoneBook 顯示電話本內(nèi)容
End Sub
Private Sub Portopen_Test() 打開端口并測試
If Mobcomm.PortOpen = False Then
Mobcomm.CommPort = True
End If
Mobcomm.Output = "AT" + vbCr
Timer1.Enabled = True
End Sub
評論