<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)控制GPS/GSM原理(虛擬串口)

          單片機(jī)控制GPS/GSM原理(虛擬串口)

          作者: 時(shí)間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
          全球定位系統(tǒng)(Global Positioning System,GPS)是美國(guó)國(guó)防部于1973年提出,歷時(shí)20年,耗資200多億美元建立起來的,具有在海、陸、空進(jìn)行全方位實(shí)時(shí)三維導(dǎo)航與定位能力的新一代衛(wèi)星導(dǎo)航與定位系統(tǒng)。GPS能為用戶提供連續(xù)實(shí)時(shí)、高精度的三維位置、三維速度和時(shí)間基準(zhǔn),是一種全球性、全天候、連續(xù)的衛(wèi)星無線電導(dǎo)航系統(tǒng)。在目前世界上所有的衛(wèi)星定位系統(tǒng)中,GPS是技術(shù)最成熟,應(yīng)用最為廣泛的。

          在遠(yuǎn)程目標(biāo)定位中,需要將利用GPS技術(shù)獲得的遠(yuǎn)程目標(biāo)的定位信息發(fā)送到監(jiān)控中心。這可利用無線電臺(tái)進(jìn)行發(fā)送,但是該方法容易受到干擾而且還受到電臺(tái)通信距離的限制。隨著移動(dòng)通信的發(fā)展和GSM網(wǎng)絡(luò)的廣泛覆蓋,GSM短消息業(yè)務(wù)也得到廣泛應(yīng)用,利用短消息服務(wù)來傳輸GPS定位數(shù)據(jù)是具有優(yōu)勢(shì)的。GSM網(wǎng)絡(luò)容量大,通信盲區(qū)少,利用該方法不僅可以克服傳輸距離的限制,而且相當(dāng)方便、可靠,費(fèi)用也十分低廉。結(jié)合GSM網(wǎng)絡(luò)作為數(shù)據(jù)傳輸方式的各種優(yōu)點(diǎn)和GPS這一成熟的定位技術(shù),本文研究并實(shí)現(xiàn)了一種利用較少的資源就可實(shí)現(xiàn)的基于虛擬串口的GPS/GSM遠(yuǎn)程定位技術(shù)。

          本文引用地址:http://www.ex-cimer.com/article/201611/315390.htm

          1 系統(tǒng)架構(gòu)

          系統(tǒng)構(gòu)成框圖如圖1所示。在遠(yuǎn)程目標(biāo)端,單片機(jī)通過GPS模塊獲取有用的信息,如經(jīng)緯度、時(shí)間、速度等信息,定時(shí)的以短消息的形式操控GSM短消息模塊發(fā)送定位數(shù)據(jù)給監(jiān)控中心。在監(jiān)控中心部分,采用一個(gè)GSM模塊與PC機(jī)通信,編寫一個(gè)PC上的軟件實(shí)現(xiàn)收發(fā)短消息、撥打電話、保存短消息等功能,并顯示出遠(yuǎn)程目標(biāo)定位信息。同時(shí),通過撥打遠(yuǎn)程目標(biāo)處TC35i模塊的電話可實(shí)現(xiàn)系統(tǒng)的一些擴(kuò)展功能。

          1.1 GPS模塊

          GPS模塊采用的是Navman公司的Jupiter 21OEM板,它具有12通道,體積小、重量輕、功耗低;定位迅速準(zhǔn)確,抗干擾性能突出;操作簡(jiǎn)便、易于開發(fā),可通過串口與PC機(jī)進(jìn)行通訊??梢愿鶕?jù)通信的波特率選擇輸出NMEA-0183語句格式或者SIRF二進(jìn)制格式的定位信息,默認(rèn)情況下輸出為NMEA-0183語句格式。該模塊還具有1 PPS秒脈沖輸出,且精度優(yōu)于1μs,在本系統(tǒng)設(shè)計(jì)中用對(duì)1 PPS秒脈沖計(jì)數(shù)的方法很好地實(shí)現(xiàn)了收發(fā)短信的定時(shí)。

          1.2 GSM短消息模塊

          GSM短消息模塊采用的是SIEMENS公司的TC35i模塊,這是一個(gè)支持中文短消息的工業(yè)級(jí)GSM模塊,工作在EGSM 900和GSM 1800雙頻段,電源范圍為3.3~5.5 V,可傳輸語音和數(shù)據(jù)信息,可以利用AT命令通過接口電路對(duì)其進(jìn)行控制。TC35i模塊支持以TEXT模式和PDU模式發(fā)送短消息,使用TEXT模式發(fā)送短消息代碼簡(jiǎn)單,容易實(shí)現(xiàn),但不能收發(fā)中文短信,而PDU格式實(shí)現(xiàn)較復(fù)雜,但可以收發(fā)中文短信。系統(tǒng)設(shè)計(jì)中處于簡(jiǎn)單且能滿足系統(tǒng)需要考慮,采用的TEXT模式收發(fā)短消息。

          1.3主控單元

          主控單元采用AT89S52單片機(jī)作為控制器,單片機(jī)通過串口與GPS模塊以及GSM模塊進(jìn)行通信。在此需要兩個(gè)串口,而AT89S52單片機(jī)本身只有一個(gè)串口,常規(guī)的解決方法是采用具有雙串口的單片機(jī)或者ARM等控制器,或者通過硬件來擴(kuò)展串口。前者會(huì)使系統(tǒng)的硬件成本大大提高,而后者不僅會(huì)增加系統(tǒng)的成本,還會(huì)增大系統(tǒng)硬件的體積。本文采取的解決辦法是,AT89S52單片機(jī)本身的串口用于跟GPS模塊進(jìn)行通信,而利用I/O口P1.4和P3.2編程實(shí)現(xiàn)一個(gè)虛擬串口與TC35i模塊進(jìn)行通信。由于單片機(jī)內(nèi)部定時(shí)/計(jì)數(shù)器只能實(shí)現(xiàn)較小時(shí)間的定時(shí),所以巧妙利用了單片機(jī)的T2定時(shí)/計(jì)數(shù)器(P1.0)對(duì)Jupiter 21 OEM板的1 PPS秒脈沖輸出進(jìn)行計(jì)數(shù)方便地實(shí)現(xiàn)5 min定時(shí),用于收發(fā)短信所需的定時(shí)。該部分還擴(kuò)展了報(bào)警電路和控制開關(guān)通斷等功能電路,這是由監(jiān)控中心通過撥打遠(yuǎn)程目標(biāo)端的電話來控制的。同時(shí),還保留了單片機(jī)的剩余I/O口用于系統(tǒng)的進(jìn)一步擴(kuò)充。

          2系統(tǒng)軟件設(shè)計(jì)

          2.1單片機(jī)部分軟件設(shè)計(jì)

          單片機(jī)部分的程序流程圖如圖2所示。該部分程序采用C語言編程實(shí)現(xiàn),主要包括定位信息的提取、虛擬串口通信以及短消息的發(fā)送三個(gè)部分。

          2.1.1 定位信息的提取

          單片機(jī)采用4 800 b/s波特率與GPS模塊進(jìn)行異步串行通訊,從GPS模塊輸出的是NMEA-01183語句格式的數(shù)據(jù)。該語句格式的數(shù)據(jù)以“$”開頭,包括$GPRMC,$GPGGA,$GPGSV,$GPVTG,$GPGSA,$GPGLL等語句。系統(tǒng)設(shè)計(jì)中只從中提取出$GPRMC語句,再進(jìn)一步提取出里面包含的經(jīng)緯度、速度、時(shí)間等信息,已經(jīng)可以滿足系統(tǒng)的需求。該部分的軟件流程圖如圖3所示。

          2.1.2 虛擬串口

          單片機(jī)與GSM模塊之間通過虛擬串口.進(jìn)行通信,以解決AT89S52單片機(jī)固有串口不足的問題,通信波特率取為9 600 b/s。虛擬串口就是利用單片機(jī)I/O編程實(shí)現(xiàn)一個(gè)串口的功能,這樣就以較少的資源實(shí)現(xiàn)了系統(tǒng)的功能,克服了傳統(tǒng)的采用具有雙串口的控制器或者利用硬件進(jìn)行串口擴(kuò)展的方法其成本高、體積大的缺點(diǎn)。程序中采用定時(shí)器工作于方式2進(jìn)行一個(gè)數(shù)據(jù)位傳輸時(shí)間的定時(shí),用于嚴(yán)格控制一個(gè)數(shù)據(jù)位的傳輸時(shí)間。單片機(jī)采用11.059 2 MHz晶振,這樣定時(shí)器的初值為256—(1 000 000/9 600)/(12/11.059 2)=160,即十六進(jìn)制的0xA0。實(shí)驗(yàn)結(jié)果證明,采用該方法進(jìn)行串口通訊,數(shù)據(jù)傳輸穩(wěn)定、可靠。采用虛擬串口發(fā)送、接收一個(gè)字符的程序流程圖分別如圖4,圖5所示。

          2.1.3發(fā)送短消息

          主要是由單片機(jī)根據(jù)發(fā)送短消息的特定步驟,采用AT命令控制GSM模塊發(fā)送短消息,是系統(tǒng)設(shè)計(jì)中最重要的內(nèi)容之一。該部分程序設(shè)計(jì)中,由于會(huì)涉及到單片機(jī)與GSM模塊的多次交互過程,而GSM模塊響應(yīng)較單片機(jī)來的慢,特別是涉及到FLASH或SIM卡的操作及網(wǎng)絡(luò)的交互時(shí),必須要考慮到GSM模塊的響應(yīng)時(shí)間問題。系統(tǒng)中采用TEXT模式發(fā)送短消息,步驟如下:

          2.2監(jiān)控中心軟件設(shè)計(jì)

          至此,英文短信發(fā)送成功,此過程中若模塊回復(fù)出現(xiàn)ERROR則短信發(fā)送不成功。以上步驟1,3,4經(jīng)設(shè)置后無需再設(shè)置,步驟2在模塊斷電時(shí)需重設(shè),步驟5,6在每次發(fā)送短消息時(shí)都要重復(fù)進(jìn)行。

          在監(jiān)控中心的PC機(jī)上采用VB結(jié)合ACCESS數(shù)據(jù)庫設(shè)計(jì)一個(gè)監(jiān)控軟件,該軟件通過串口與GSM模塊進(jìn)行通信,獲取遠(yuǎn)程目標(biāo)的定位信息,經(jīng)過進(jìn)一步處理后顯示出來。由于電子地圖制作復(fù)雜、價(jià)格較貴,所以本系統(tǒng)示意性的利用由Google Earth軟件上截圖出來的圖片作為電子地圖,用于直觀地顯示出遠(yuǎn)程目標(biāo)的具體位置。ACCESS數(shù)據(jù)庫用于保存收發(fā)短消息的內(nèi)容,該軟件還具有撥打電話等功能。

          3實(shí)驗(yàn)結(jié)果及分析

          利用該軟件進(jìn)行實(shí)驗(yàn)得到的結(jié)果如圖6所示。圖中左半部分是軟件的實(shí)現(xiàn)界面,右半部分是以GoogleEarth軟件截圖出來的圖片作為虛擬的電子地圖來示意性的說明問題。實(shí)驗(yàn)中,GPS天線置于福州大學(xué)旗山校區(qū)電氣學(xué)院樓頂,監(jiān)控中心位于電氣學(xué)院南303實(shí)驗(yàn)室。由圖中左半部分可以看到目標(biāo)最近一次的定位信息:定位時(shí)間:10:28:28;緯度:26°043.03N;經(jīng)度:119°1142.57E;速度:0.048 m/s。右半部分圖中的紅、綠、藍(lán)小圓圈代表近三次實(shí)驗(yàn)獲得的定位位置結(jié)果(在地圖上幾乎重合,為說明位置在圖中進(jìn)行引出標(biāo)注),紅色小圓點(diǎn)代表天線的真實(shí)位置(在圖中也進(jìn)行引出標(biāo)注說明),Google Earth軟件中的地標(biāo),用GoogleEarth軟件的測(cè)距工具測(cè)得實(shí)驗(yàn)結(jié)果與天線真實(shí)位置的誤差約為12 m,這主要由GPS模塊的定位精度所決定。

          由實(shí)驗(yàn)結(jié)果可以看出,定位位置結(jié)果基本一致,但經(jīng)緯度、速度存在很小的零漂移,這是正常的,零漂移的大小取決于GPS模塊的性能。經(jīng)過長(zhǎng)期實(shí)驗(yàn)證實(shí),系統(tǒng)穩(wěn)定、可靠,定位誤差較小,基本上可滿足一般的應(yīng)用要求。若要應(yīng)用于對(duì)定位精度要求較高的場(chǎng)合,可以考慮采用定位精度更高的GPS模塊等措施。

          4結(jié) 語

          實(shí)驗(yàn)結(jié)果表明,系統(tǒng)運(yùn)行穩(wěn)定、可靠,可以實(shí)現(xiàn)無距離限制的遠(yuǎn)程定位。由于采用了虛擬串口技術(shù),所以以較少的資源實(shí)現(xiàn)了GPS/GSM遠(yuǎn)程定位技術(shù),該定位技術(shù)可以應(yīng)用于進(jìn)行遠(yuǎn)程定位的多種領(lǐng)域。但是,由于作為定位數(shù)據(jù)傳輸網(wǎng)絡(luò)的GSM網(wǎng)絡(luò)的固有問題,對(duì)系統(tǒng)的實(shí)時(shí)性有一定的影響。比如,有時(shí)會(huì)出現(xiàn)收發(fā)短消息延時(shí)的問題,特別是在網(wǎng)絡(luò)擁擠的時(shí)候,有時(shí)還存在較小區(qū)域的通信盲區(qū),可以考慮與運(yùn)營(yíng)商建立一條專用短消息傳輸通道來保證遠(yuǎn)程定位信息的可靠傳輸。相信隨著定位技術(shù)、通信技術(shù)以及GIS技術(shù)的不斷發(fā)展,本文所討論的遠(yuǎn)程定位技術(shù)將會(huì)得到廣泛的應(yīng)用。

          傳統(tǒng)的通信方式主 要有短波通信、衛(wèi)星通信和超短波通信[1]。短波通信由于其固有缺 點(diǎn)且受氣候的影響大,在實(shí)時(shí)采集數(shù)據(jù)傳輸系統(tǒng)用中很少采用。衛(wèi)星通信的傳輸質(zhì)量好,傳 輸距離不受限制,覆蓋面積大,受地形、氣候的影響小,組網(wǎng)靈活,但目前運(yùn)行費(fèi)用偏高。 超短波通信的信號(hào)傳輸比較穩(wěn)定,質(zhì)量較好,又具有一定的繞射能力,是我國(guó)目前應(yīng)用最多 、技術(shù)上也比較成熟的通信方式,但屬于視距傳輸,且受地形限制,在山地通信時(shí)需要設(shè)置 中繼站,這樣會(huì)增加成本。

          實(shí)時(shí)采集數(shù)據(jù)傳輸頻率較高,但數(shù)據(jù)信息量小。GSM(Global System for Mobile Commu nications)網(wǎng)絡(luò)當(dāng)中的短消息服務(wù)(SMS,Short Messaging Service)適合于實(shí)時(shí)采集數(shù)據(jù) 的傳輸。目前一條短消息的信息量限制為140個(gè)字節(jié)[2],短消息業(yè)務(wù)可以被認(rèn)為 是GSM 系統(tǒng) 中最為簡(jiǎn)單和方便的數(shù)據(jù)通訊方式,它無需附加龐大和昂貴的數(shù)據(jù)終端設(shè)備,僅使用GSM模 塊就可以達(dá)到互相進(jìn)行通信的目的。再一個(gè)優(yōu)點(diǎn)就是由于利用了現(xiàn)有的網(wǎng)絡(luò),用戶無需另外 組網(wǎng),所以節(jié)省了昂貴的組建網(wǎng)費(fèi)用和維護(hù)費(fèi)用,同時(shí),對(duì)用戶的數(shù)量沒有任何限制。
          1 硬件電路及工作原理

          GSM模塊采用WAVECOM公司推出的wism02c,支持AT指令。單片機(jī)采用AT89C51。

          GSM模塊數(shù)據(jù)線是專為連接PC機(jī)9針串口而設(shè)計(jì)的,①信號(hào)電平為標(biāo)準(zhǔn)的RS232電平, 只要單片機(jī)的串口也轉(zhuǎn)換為RS232電平,就可直接連接。②9針串口的引腳定義是固定的, 即2腳為TXD(GSM模塊發(fā)送)、3腳為RXD(GSM模塊接收)、5腳為GND。這樣直接連接這幾個(gè)線也 可以。單片機(jī)輸出的是TTL電平,即0~+5v的電壓,而RS232輸出的是-20V~20V的電壓。所 以不能直接連接,需要一個(gè)電壓轉(zhuǎn)換芯片MAX232。如圖1所示。

          單片機(jī)利用AT指令控制GSM模塊,將數(shù)據(jù)傳送出去。AT指令按照GSM模塊支持的AT指令 格式書寫,通過單片機(jī)的串口發(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。申請(qǐng)了短消息服務(wù)的用戶,在手機(jī)上設(shè)置短消息中心號(hào)碼后即可 發(fā)送短消息,接收短消息無需任何設(shè)置。一條短消息的最大長(zhǎng)度可為160個(gè)英文字符(7位編 碼)或70個(gè)漢字(16位編碼)。短消息是通過控制信道傳輸?shù)模徽紭I(yè)務(wù)信道,在通話的同時(shí) 也可以接收短消息。

          按短消息發(fā)送的方式可分為:塊模式(Block Mode)、文本模式(Text Mode)和pdu 模式。
          2.1 塊模式(BLOCK Mode)

          塊模式是一個(gè)二進(jìn)制協(xié)議,用于移動(dòng)臺(tái)和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模式提供的功能少。在文本模式下,短消息對(duì)擴(kuò)展字符的能力是有限的。
          2.3 PDU模式(PDU Mode)

          PDU模式和文本模式很相似,主要的區(qū)別是它將組裝短消息的任務(wù) 留給應(yīng)用系統(tǒng)完成。該模式使AT指令集能方便地組構(gòu)更多復(fù)雜的PDU,例如既可以傳遞二進(jìn) 制數(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,移動(dòng)基 站)的功能與GSM網(wǎng)絡(luò)業(yè)務(wù)進(jìn)行交互[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=<手機(jī)號(hào)碼><0X1A>;

          例如:對(duì)方號(hào)碼是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(短信中心)號(hào)碼是+8613800471500,對(duì)方號(hào)碼是13947178096,消息內(nèi)容是:“ 水位”。則手機(jī)發(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]

          ①檢測(cè)TCP/IP(該協(xié)議一般沒有問題,只要網(wǎng)絡(luò)連接正確即可)。

          ②復(fù)制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 單片機(jī)串口通信

          單片機(jī)晶振頻率為11.0592MHz,選擇串行模式1,所以波特率為9600Kbit/s[7]。單片機(jī) 采用查詢的方式發(fā)送數(shù)據(jù),如果AT指令格式正確,GSM模塊返回應(yīng)答信息給單片機(jī)。將程序 繞錄到單片機(jī)之前,可以利用超級(jí)終端和GSM模塊的通信確定AT指令的格式。
          4.3 發(fā)送短信仿真圖

          圖3為用文本模式發(fā)送內(nèi)容“123”到手機(jī)號(hào)碼13947178096的仿真圖。

          圖4為用pdu模式發(fā)送短信“水位”到手機(jī)號(hào)碼13947178096的仿真圖。

          740)this.width=740" border=undefined zoom_img(event,this)">

          單片機(jī)與GSM之間的通信調(diào)試成功。
          ------------------------------------全局變量聲明---------------------------------------
          Dim portno As Integer 端口號(hào)
          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ù)(延時(shí)功能)
          Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
          GetWindowTextW 指明這是一個(gè) 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() 檢測(cè)新信息
          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 把電話號(hào)碼轉(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 "電話號(hào)碼有誤!" & 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) 電話號(hào)碼譯碼
          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) 時(shí)間譯碼
          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)錯(cuò)誤,請(qǐng)重新發(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è)置端口號(hào)為:" & 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")) 肇慶動(dòng)感地帶短信信中心地址
          TelNo = Trim(telc(teln.Text)) 手機(jī)號(hào)碼
          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 + " 對(duì)方號(hào)碼: " + SN + vbCr
          + vbLf + " 發(fā)送時(shí)間: " _
          + STIME + vbCr + vbLf + " 短信長(zhǎng)度: " + 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 = " 短信類型: " + "存儲(chǔ)信息" + 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 "你有新的信息,請(qǐng)查收!"
          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 "時(shí)間日期: " + sDateTime
          DebugText "電話號(hào)碼: " + 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() 打開端口并測(cè)試
          If Mobcomm.PortOpen = False Then
          Mobcomm.CommPort = True
          End If
          Mobcomm.Output = "AT" + vbCr
          Timer1.Enabled = True
          End Sub



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();