【正文】
鑒于我的水平有限,難免存在一些錯(cuò)誤和漏洞,望各位老師不吝賜教,在此向大家表示忠心的感謝。經(jīng)過此次畢業(yè)設(shè)計(jì),使我對(duì)無線通信和無線自動(dòng)控制方面的知識(shí)有了很深的理解。畢業(yè)設(shè)計(jì)的順利完成使我獲得很多平時(shí)沒有學(xué)到的知識(shí)。致謝本次論文的完成,首先感謝母?!髂鲜痛髮W(xué)的辛勤培育,感謝電子信息工程學(xué)院給我提供了很好的環(huán)境,并非常感謝我的指導(dǎo)老師焦培林老師和輔導(dǎo)老師呂金萍老師耐心的指導(dǎo)和諄諄教誨。VB是一個(gè)面向?qū)ο蟮目梢暬O(shè)計(jì)與面向?qū)ο蟮恼Z(yǔ)言相結(jié)合的集成開發(fā)環(huán)境。此次設(shè)計(jì)不僅僅是一個(gè)應(yīng)用程序編寫的過程,更重要的是在系統(tǒng)的分析和設(shè)計(jì)階段所做的工作。此次設(shè)計(jì)基本上達(dá)到了預(yù)期的目的,實(shí)現(xiàn)了其基本的功能。 功能實(shí)現(xiàn)演示如下:打開短信息收發(fā)界面如圖所示。 最終達(dá)到的結(jié)果 本次設(shè)計(jì)成功的利用了VB來開發(fā)了一套實(shí)現(xiàn)短信息收發(fā)功能的信息系統(tǒng),能夠通過PC機(jī)接收和發(fā)送短信。在調(diào)試時(shí)可以提供斷點(diǎn),來逐步檢查一段一段的程序,這對(duì)龐大的系統(tǒng)程序非常有用,當(dāng)有錯(cuò)誤時(shí)光標(biāo)將移動(dòng)到錯(cuò)誤行以方便調(diào)試,就這樣直到全部程序無錯(cuò)誤。 Hex(AscW(b_b))ElseIf biai 4 Thenbiai = 4End Ifbbb = Hex(AscW(b_b))End Ifbb_b = bb_b amp。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。中文處理成Unicode碼39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。 Chr(13) amp。 gg amp。h amp。中文信息a = a + 3NextElseFor op = 1 To Len(read)gg = gg amp。h amp。 (Mid(gg, v, 2)))v = v + 1Nextread = Right(read, Len(read) GC 3)gg = aFor a = 1 To Len(read)cc = cc amp。 Chr(amp。h amp。處理英文If gd 2 Thengg = Left(read, gd 1)For v = 1 To Len(read)a = a amp。 Hex(inbyte(i))End IfNext ircu = InStr(ruc, 0D0A)If rcu 2 Thenread = Left(ruc, rcu 1)Call curuc = Right(ruc, Len(ruc) rcu 3)End IfEnd SubPublic Sub cu()g = Len(read)GC = InStr(read, 433E) 39。 0 amp。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。程序檢查輸入緩沖區(qū)中是否有數(shù)據(jù),若有數(shù)據(jù)39。定時(shí)器的Timer事件程序39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。HDert(0) = amp。HAav(0) = amp。HFDvv(0) = amp。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。打開通信端口,通信端口的參數(shù)也可以在此指定之后39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。 Mid(bb_b, a, 2) = weqa = a + 1NextEnd If = vvEnd Sub‘清除按鈕Private Sub Command2_Click() = = End Sub39。電話號(hào)碼End IfIf biai 4 Then = bb_bElseFor a = 1 To Len(bb_b)weq(0) = amp。判斷目標(biāo)碼是否是4 = adv = 86 amp。判斷發(fā)送中文End If = ac 39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。使用命令按鈕控件39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。關(guān)閉通信端口39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。39。0dDim ert(0) As ByteDim biaiDim byu(5)Dim c_cDim mmaDim cedDim reahDim rucDim TOOP(2)Dim opDim biaoDim opqDim read‘結(jié)束按鈕39。刪除符Dim av(0) As Byte 39。unicode轉(zhuǎn)換變量Dim vv(1) As Byte 39。Public Sub readsms(rnum As String) = AT+CMGF=1 + vbCr = AT+CMGR= amp。 stemp Next si ascg = Trim(ascg)End Function 短信接收函數(shù)相對(duì)于短信的發(fā)送函數(shù)而言,短信的接收相當(dāng)簡(jiǎn)單,只需要以下的三行代碼就完成了。同短信發(fā)送的編碼函數(shù)一樣,這里也應(yīng)用了一個(gè)VB內(nèi)置的函數(shù)AscW()函數(shù)來將Unicode碼轉(zhuǎn)換為中文:Public Function ascg(smsg As String) As String Dim si, sb As Integer Dim stmp As Integer Dim stemp As String sb = Len(smsg) ascg = For si = 1 To sb stmp = AscW(Mid(smsg, si, 1)) If Abs(stmp) 127 Then stemp = 00 amp。短信的發(fā)送需要將待發(fā)送的短信內(nèi)容轉(zhuǎn)換為Unicode碼,而短信的接收則需要將接收到的Unicode碼轉(zhuǎn)換成中文字符。 Str(15 + length) + vbCr = pdu amp。 leng amp。 pnum amp。 psmsc amp。短信的發(fā)送是由AT+CMGS指令完成的,采用PDU模式發(fā)送,函數(shù)代碼如下:Const prex = 0891Const midx = 11000D91Const sufx = 000800Public Function Sendsms(csca As String, num As String, msg As String) As _Boolean Dim pdu, psmsc, pnum, pmsg 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 amp。 ltem Next ti telc = ttem End Function 手機(jī)號(hào)碼有兩種表示方法:11位和13位(帶國(guó)家碼86),一般手機(jī)發(fā)送時(shí)都是以13位形式表示的,所以以上的函數(shù)還有一個(gè)功能是自動(dòng)將11位格式手機(jī)號(hào)碼轉(zhuǎn)換為13位形式,然后再轉(zhuǎn)換為PDU串。 num End If For ti = 1 To tl Step 2 ltem = Mid(num, ti, 1) rtem = Mid(num, ti + 1, 1) If ti = tl Then rtem = F ttem = ttem amp。 ChrW(CInt(Val(temp))) Next i End Function 短信中心手機(jī)號(hào)碼的PDU串轉(zhuǎn)換函數(shù) 同上,為了發(fā)送以PDU模式發(fā)送短消息,必須將手機(jī)號(hào)碼和對(duì)方手機(jī)號(hào)碼也轉(zhuǎn)換為PDU格式,下面的函數(shù)就是為了實(shí)現(xiàn)這種轉(zhuǎn)換:Public Function telc(num As String) As String 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 wrong number. amp。H amp。這個(gè)函數(shù)主要應(yīng)用到VB自帶的一個(gè)格式轉(zhuǎn)換函數(shù):ChrW()將中文轉(zhuǎn)換為Unicode碼。它以ASCII為設(shè)計(jì)基礎(chǔ),而統(tǒng)一的編碼方式。這樣“TESTU “的8bit編碼為D4E2940A02。這些值只需要7bit去定義,而SMS短信息是以8bit字節(jié)序列傳輸?shù)模虼薌SM使用一種編碼方式將7bit ASCII碼值序列壓縮成8 bit字節(jié)序列。實(shí)現(xiàn)的界面如圖57所示。加入一個(gè)通訊控件,名稱為MSComml。設(shè)置:19 200,n,8,1編寫代碼在窗體中加入一個(gè)組合框控件,名稱為Comboport,用于選擇設(shè)置通訊端口。當(dāng)接收緩沖區(qū)中的字符數(shù)大于等于該值時(shí),將產(chǎn)生OnComm事件。設(shè)置:512。設(shè)置:lnputModeBinary輸入為二進(jìn)制數(shù)據(jù)。設(shè)置:16 500。l~16,設(shè)置:1為COM1口。實(shí)例用于接收和發(fā)送不定長(zhǎng)數(shù)據(jù)包,該儀器的通信協(xié)議如下。下面的示例程序是利用MSComm控件的Intput屬性接收數(shù)據(jù):Private Sub Commandl— Click0’用戶單擊Commandl按鈕后讀取輸入緩沖區(qū)中的內(nèi)容Dim InS as StringMsComm 1.InputLen=OIf MsComm 1.InBuferCount ThenInS=MsComm 1.InputEnd IfMsgBox InSMsComm 1.PortOpen=FalseEnd Sub開發(fā)步驟:創(chuàng)建新的工程① 啟動(dòng)Visual Basic 6.0②在“文件”菜單中,單擊“新建工程”,選擇“”. 單擊確定加人MSComm控件① 在“工程”菜單中單擊“部件”.顯示“部件”對(duì)話框 ② 選定“Microsoft Comm Control 6.O”控件名稱左邊的復(fù)選框③ 單擊”確定”關(guān)閉“部件”對(duì)話框,MSComm控件將出現(xiàn)在工具框中④ 將MSComm控件添加到窗體上添加MSComm控件如圖56所示。InputMode屬性值決定著Input屬性接收的數(shù)據(jù)類型。InputLen屬性值決定著Input屬性讀取的字符個(gè)數(shù)。Input屬性從接收緩沖區(qū)中返回一串?dāng)?shù)據(jù),它在設(shè)計(jì)階段是無效的,在運(yùn)行階段也只能讀。如果要發(fā)送文本數(shù)據(jù).Value就必須是含有字符串的Variant數(shù)據(jù);如果要發(fā)送二進(jìn)制數(shù)據(jù),Value就必須是含有Byte數(shù)組的Variant數(shù)據(jù)。其引用方法如下:MSComm.Output[=value]其中.Value參數(shù)表示一串要寫入到發(fā)送緩沖區(qū)中的字符。而查詢方式是在程序通過查詢CommEvent屬性的值來判斷通信過程中的事件或錯(cuò)誤.這種方式適合于應(yīng)用程序較小、實(shí)時(shí)性要求不高的系統(tǒng)中 。MSComm控件進(jìn)行串行通信的一般步驟為:1)設(shè)置通信對(duì)象、通信端口號(hào)及其他屬性;2)設(shè)定通信協(xié)議;3)打開通信端口,進(jìn)行數(shù)據(jù)的傳送;4)關(guān)閉通信端口;MSComm控件通信方式的選擇:MSComm控件有兩種處理通信的方式,即事件驅(qū)動(dòng)和查詢方式。如果CommEvent屬性值發(fā)生了變化,而通信事件又