×
嵌入式 > 嵌入式开发 > 详情

单片机控制GPS/GSM原理(虚拟串口)

发布时间:2021-05-12 发布时间:
|
全球定位系统(Global Positioning System,GPS)是美国国防部于1973年提出,历时20年,耗资200多亿美元建立起来的,具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。GPS能为用户提供连续实时、高精度的三维位置、三维速度和时间基准,是一种全球性、全天候、连续的卫星无线电导航系统。在目前世界上所有的卫星定位系统中,GPS是技术最成熟,应用最为广泛的。

在远程目标定位中,需要将利用GPS技术获得的远程目标的定位信息发送到监控中心。这可利用无线电台进行发送,但是该方法容易受到干扰而且还受到电台通信距离的限制。随着移动通信的发展和GSM网络的广泛覆盖,GSM短消息业务也得到广泛应用,利用短消息服务来传输GPS定位数据是具有优势的。GSM网络容量大,通信盲区少,利用该方法不仅可以克服传输距离的限制,而且相当方便、可靠,费用也十分低廉。结合GSM网络作为数据传输方式的各种优点和GPS这一成熟的定位技术,本文研究并实现了一种利用较少的资源就可实现的基于虚拟串口的GPS/GSM远程定位技术。

 

1 系统架构

系统构成框图如图1所示。在远程目标端,单片机通过GPS模块获取有用的信息,如经纬度、时间、速度等信息,定时的以短消息的形式操控GSM短消息模块发送定位数据给监控中心。在监控中心部分,采用一个GSM模块与PC机通信,编写一个PC上的软件实现收发短消息、拨打电话、保存短消息等功能,并显示出远程目标定位信息。同时,通过拨打远程目标处TC35i模块的电话可实现系统的一些扩展功能。

1.1 GPS模块

GPS模块采用的是Navman公司的Jupiter 21OEM板,它具有12通道,体积小、重量轻、功耗低;定位迅速准确,抗干扰性能突出;操作简便、易于开发,可通过串口与PC机进行通讯。可以根据通信的波特率选择输出NMEA-0183语句格式或者SIRF二进制格式的定位信息,默认情况下输出为NMEA-0183语句格式。该模块还具有1 PPS秒脉冲输出,且精度优于1μs,在本系统设计中用对1 PPS秒脉冲计数的方法很好地实现了收发短信的定时。

1.2 GSM短消息模块

GSM短消息模块采用的是SIEMENS公司的TC35i模块,这是一个支持中文短消息的工业级GSM模块,工作在EGSM 900和GSM 1800双频段,电源范围为3.3~5.5 V,可传输语音和数据信息,可以利用AT命令通过接口电路对其进行控制。TC35i模块支持以TEXT模式和PDU模式发送短消息,使用TEXT模式发送短消息代码简单,容易实现,但不能收发中文短信,而PDU格式实现较复杂,但可以收发中文短信。系统设计中处于简单且能满足系统需要考虑,采用的TEXT模式收发短消息。

1.3主控单元

主控单元采用AT89S52单片机作为控制器,单片机通过串口与GPS模块以及GSM模块进行通信。在此需要两个串口,而AT89S52单片机本身只有一个串口,常规的解决方法是采用具有双串口的单片机或者ARM等控制器,或者通过硬件来扩展串口。前者会使系统的硬件成本大大提高,而后者不仅会增加系统的成本,还会增大系统硬件的体积。本文采取的解决办法是,AT89S52单片机本身的串口用于跟GPS模块进行通信,而利用I/O口P1.4和P3.2编程实现一个虚拟串口与TC35i模块进行通信。由于单片机内部定时/计数器只能实现较小时间的定时,所以巧妙利用了单片机的T2定时/计数器(P1.0)对Jupiter 21 OEM板的1 PPS秒脉冲输出进行计数方便地实现5 min定时,用于收发短信所需的定时。该部分还扩展了报警电路和控制开关通断等功能电路,这是由监控中心通过拨打远程目标端的电话来控制的。同时,还保留了单片机的剩余I/O口用于系统的进一步扩充。

2系统软件设计

2.1单片机部分软件设计

单片机部分的程序流程图如图2所示。该部分程序采用C语言编程实现,主要包括定位信息的提取、虚拟串口通信以及短消息的发送三个部分。

2.1.1 定位信息的提取

单片机采用4 800 b/s波特率与GPS模块进行异步串行通讯,从GPS模块输出的是NMEA-01183语句格式的数据。该语句格式的数据以“$”开头,包括$GPRMC,$GPGGA,$GPGSV,$GPVTG,$GPGSA,$GPGLL等语句。系统设计中只从中提取出$GPRMC语句,再进一步提取出里面包含的经纬度、速度、时间等信息,已经可以满足系统的需求。该部分的软件流程图如图3所示。

2.1.2 虚拟串口

单片机与GSM模块之间通过虚拟串口.进行通信,以解决AT89S52单片机固有串口不足的问题,通信波特率取为9 600 b/s。虚拟串口就是利用单片机I/O编程实现一个串口的功能,这样就以较少的资源实现了系统的功能,克服了传统的采用具有双串口的控制器或者利用硬件进行串口扩展的方法其成本高、体积大的缺点。程序中采用定时器工作于方式2进行一个数据位传输时间的定时,用于严格控制一个数据位的传输时间。单片机采用11.059 2 MHz晶振,这样定时器的初值为256—(1 000 000/9 600)/(12/11.059 2)=160,即十六进制的0xA0。实验结果证明,采用该方法进行串口通讯,数据传输稳定、可靠。采用虚拟串口发送、接收一个字符的程序流程图分别如图4,图5所示。

2.1.3发送短消息

主要是由单片机根据发送短消息的特定步骤,采用AT命令控制GSM模块发送短消息,是系统设计中最重要的内容之一。该部分程序设计中,由于会涉及到单片机与GSM模块的多次交互过程,而GSM模块响应较单片机来的慢,特别是涉及到FLASH或SIM卡的操作及网络的交互时,必须要考虑到GSM模块的响应时间问题。系统中采用TEXT模式发送短消息,步骤如下:

2.2监控中心软件设计

至此,英文短信发送成功,此过程中若模块回复出现ERROR则短信发送不成功。以上步骤1,3,4经设置后无需再设置,步骤2在模块断电时需重设,步骤5,6在每次发送短消息时都要重复进行。

在监控中心的PC机上采用VB结合ACCESS数据库设计一个监控软件,该软件通过串口与GSM模块进行通信,获取远程目标的定位信息,经过进一步处理后显示出来。由于电子地图制作复杂、价格较贵,所以本系统示意性的利用由Google Earth软件上截图出来的图片作为电子地图,用于直观地显示出远程目标的具体位置。ACCESS数据库用于保存收发短消息的内容,该软件还具有拨打电话等功能。

3实验结果及分析

利用该软件进行实验得到的结果如图6所示。图中左半部分是软件的实现界面,右半部分是以GoogleEarth软件截图出来的图片作为虚拟的电子地图来示意性的说明问题。实验中,GPS天线置于福州大学旗山校区电气学院楼顶,监控中心位于电气学院南303实验室。由图中左半部分可以看到目标最近一次的定位信息:定位时间:10:28:28;纬度:26°043.03N;经度:119°1142.57E;速度:0.048 m/s。右半部分图中的红、绿、蓝小圆圈代表近三次实验获得的定位位置结果(在地图上几乎重合,为说明位置在图中进行引出标注),红色小圆点代表天线的真实位置(在图中也进行引出标注说明),Google Earth软件中的地标,用GoogleEarth软件的测距工具测得实验结果与天线真实位置的误差约为12 m,这主要由GPS模块的定位精度所决定。

由实验结果可以看出,定位位置结果基本一致,但经纬度、速度存在很小的零漂移,这是正常的,零漂移的大小取决于GPS模块的性能。经过长期实验证实,系统稳定、可靠,定位误差较小,基本上可满足一般的应用要求。若要应用于对定位精度要求较高的场合,可以考虑采用定位精度更高的GPS模块等措施。

4结 语

实验结果表明,系统运行稳定、可靠,可以实现无距离限制的远程定位。由于采用了虚拟串口技术,所以以较少的资源实现了GPS/GSM远程定位技术,该定位技术可以应用于进行远程定位的多种领域。但是,由于作为定位数据传输网络的GSM网络的固有问题,对系统的实时性有一定的影响。比如,有时会出现收发短消息延时的问题,特别是在网络拥挤的时候,有时还存在较小区域的通信盲区,可以考虑与运营商建立一条专用短消息传输通道来保证远程定位信息的可靠传输。相信随着定位技术、通信技术以及GIS技术的不断发展,本文所讨论的远程定位技术将会得到广泛的应用。

传统的通信方式主 要有短波通信、卫星通信和超短波通信ue00bue008[1]ue009。短波通信由于其固有缺 点且受气候的影响大,在实时采集数据传输系统用中很少采用。卫星通信的传输质量好,传 输距离不受限制,覆盖面积大,受地形、气候的影响小,组网灵活,但目前运行费用偏高。 超短波通信的信号传输比较稳定,质量较好,又具有一定的绕射能力,是我国目前应用最多 、技术上也比较成熟的通信方式,但属于视距传输,且受地形限制,在山地通信时需要设置 中继站,这样会增加成本。ue004

实时采集数据传输频率较高,但数据信息量小。GSM(Global System for Mobile Commu nications)网络当中的短消息服务(SMS,Short Messaging Service)适合于实时采集数据 的传输。目前一条短消息的信息量限制为140个字节[2],短消息业务可以被认为 是GSM 系统 中最为简单和方便的数据通讯方式,它无需附加庞大和昂贵的数据终端设备,仅使用GSM模 块就可以达到互相进行通信的目的。再一个优点就是由于利用了现有的网络,用户无需另外 组网,所以节省了昂贵的组建网费用和维护费用,同时,对用户的数量没有任何限制。ue003
1 硬件电路及工作原理ue004

GSM模块采用WAVECOM公司推出的wism02c,支持AT指令。单片机采用AT89C51。ue004

GSM模块数据线是专为连接PC机9针串口而设计的,①信号电平为标准的RS232电平, 只要单片机的串口也转换为RS232电平,就可直接连接。②9针串口的引脚定义是固定的, 即2脚为TXD(GSM模块发送)、3脚为RXD(GSM模块接收)、5脚为GND。这样直接连接这几个线也 可以。单片机输出的是TTL电平,即0~+5v的电压,而RS232输出的是-20V~20V的电压。所 以不能直接连接,需要一个电压转换芯片MAX232。如图1所示。ue004

单片机利用AT指令控制GSM模块,将数据传送出去。AT指令按照GSM模块支持的AT指令 格式书写,通过单片机的串口发送出去。

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

短消息(Short Message ,SM)是GSM网络系统的主要增值业务之一,短消息接收和发送的 业务代码分别为T21和T22。申请了短消息服务的用户,在手机上设置短消息中心号码后即可 发送短消息,接收短消息无需任何设置。一条短消息的最大长度可为160个英文字符(7位编 码)或70个汉字(16位编码)。短消息是通过控制信道传输的,不占业务信道,在通话的同时 也可以接收短消息。ue004

按短消息发送的方式可分为:块模式(Block Mode)、文本模式(Text Mode)和pdu 模式。ue003
2.1 块模式(BLOCK Mode)ue004

块模式是一个二进制协议,用于移动台和SMSC之间的 短消息传输的PDU(Protocol Description Unit)封装
2.2 文本模式(TEXT Mode)ue004

文本模式是在为GSM修改的AT指令集的基础上定义的基于字符的 协议。适合非智能终端或终端仿真器。应用软件把纯文本消息传给GSM模块,由GSM模块来构 造TPDU(Transfer Protocol Data Unit ,传输协议数据单元)。文本模式提供的功能比块 模式和PDU模式提供的功能少。在文本模式下,短消息对扩展字符的能力是有限的。
2.3 PDU模式(PDU Mode)ue004

PDU模式和文本模式很相似,主要的区别是它将组装短消息的任务 留给应用系统完成。该模式使AT指令集能方便地组构更多复杂的PDU,例如既可以传递二进 制数据又可以传送字符数据。这种模式给AT指令集带来了方便。ue004

本系统可发送文本模式和pdu模式的短消息。ue003
3 AT指令ue004

AT命令集是从TE(Terminal Equipment,终端设备)或DTE(Data Terminal .Equipmen t,数据终端设备)向TA(Terminal Adapter,终端适配器 )或DCE(Data Circuit Termin ating Equipment)发送的。通过TA、TE发送AT 命令来控制MS(Mobile Station,移动基 站)的功能与GSM网络业务进行交互[5]。短消息相关的主要AT指令有[6]:ue004

* AT+CMGF:选择短消息信息格式:0-PDU;1-文本ue004

* AT+CMGS:发送短消息ue004

* AT+CMGD:删除SIM卡内存的短消息ue004

* AT+CMGR:读短消息ue004

以下是发送AT指令的步骤(发送的数据都应该采用ASCII码):ue003
3.1 选择短消息格式ue004

AT+CMGF=1ue004

1为选择text mode;0为选择PDU mode;ue003
3.2 以文本模式发送短消息ue004

AT+CMGS=<0X1A>;ue004

例如:对方号码是13947178096,消息内容是:123ue004

则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,0x1aue003
3.3 以pdu模式发送短消息ue004

SMSC(短信中心)号码是+8613800471500,对方号码是13947178096,消息内容是:“ 水位”。则手机发送的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。ue003
4 软件仿真ue003
4.1 keil c 与proteus的连接ue00bue008[4]ue009ue004

①检测TCP/IP(该协议一般没有问题,只要网络连接正确即可)。ue004

②复制Proteus安装目录下MODELS文件夹里的vdm51.dll到keil c/c51/BIN目录下。ue004

③修改Keil/c51/TOOLS中[c51]的内容,添加:TDRV4=BIN\ VDM51.DLL(“PROTEUS VSM MO NITOR 51 DRIVER”)。ue004

④在keil c中选择proteus仿真器。ue004

⑤在proteus中选择Debug下的Use Remote Debug Monitor。ue003
4.2 单片机串口通信ue004

单片机晶振频率为11.0592MHz,选择串行模式1,所以波特率为9600Kbit/s[7]ue009。单片机 采用查询的方式发送数据,如果AT指令格式正确,GSM模块返回应答信息给单片机。将程序 绕录到单片机之前,可以利用超级终端和GSM模块的通信确定AT指令的格式。ue003
4.3 发送短信仿真图ue004

图3为用文本模式发送内容“123”到手机号码13947178096的仿真图。ue004

图4为用pdu模式发送短信“水位”到手机号码13947178096的仿真图。

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

单片机与GSM之间的通信调试成功。ue003
------------------------------------全局变量声明---------------------------------------
Dim portno As Integer 端口号
Dim baudrate As Long 波特率
Const prex = "0891" 定义全局静态变量
Const midx = "0011000D91"
Const sufx = "000801"
Private Const EM_LINESCROLL = &HB6
----------------------------------------------------------------------------------------
发送信息
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函数(延时功能)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
GetWindowTextW 指明这是一个 Unicode API (ASSIIunicode)
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 把电话号码转换成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)
/zixunimg/eepwimg/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) 把信息转换成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) 信息发送函数
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 "信息发送成功!", vbOKOnly, "系统提示"
Else

GoTo err
Exit Function
End If
Backstring = ""
End If
Sleep (1000)
Exit Sub
err:
MsgBox "信息发送成功!", vbOKOnly, "系统提示"
MsgBox "传送出现错误,请重新发送!", vbOKOnly, "系统提示"
End Sub

Private Function Sendsms(num As String, msg As String) As Boolean 短信发送
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 "设置端口号为:" & 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 " 所属网络: " + myActiveX.Provider
DebugText " 短信数目: " + 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)) 短信息内容
PDU = midx & TelNo & sufx & Leng & Smsg
PDU = "0011000D91683167006059F100080108828265E55FEB4E50"
AllLength = 23
myActiveX.Active = False
If Mobcomm.PortOpen = False Then
Mobcomm.PortOpen = True
SMSend AllLength, PDU 调用短信息发送程序
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 "信息发送成功!"
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, "系统提示"
Else
MsgBox "该信息为空!", vbOKOnly, "系统提示"
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 + " 发送时间: " _
+ STIME + vbCr + vbLf + " 短信长度: " + Str(SLONG / 2) + "字节" + vbCr +
vbLf + " 信息内容:" + 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 + " 信息内容:" + 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 信息显示函数
End If
End If
End Sub
Private Sub DebugText(Str) 设定输出格式
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 "消息内容: " + sText
DebugText "================================================"

MsgBox "收到新消息:" + sNum
End Sub
Private Sub myActiveX_OnPhoneBookList(ByVal PhoneBook As String)
phbook.Text = PhoneBook 显示电话本内容
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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Recogni:将高端AI芯片推向自动驾驶边缘