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

发布者:温柔心绪最新更新时间:2016-09-27 来源: eefocus关键字:单片机控制  GPS  GSM  虚拟串口 手机看文章 扫描二维码
随时随地手机看文章
全球定位系统(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模块的电话可实现系统的一些扩展功能。

单片机控制GPS/GSM原理(虚拟串口) - 大浪淘沙的日志 - 网易博客 - yangzhongfei - 阿飞的技术博客

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语言编程实现,主要包括定位信息的提取、虚拟串口通信以及短消息的发送三个部分。

单片机控制GPS/GSM原理(虚拟串口) - 大浪淘沙的日志 - 网易博客 - yangzhongfei - 阿飞的技术博客

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所示。

单片机控制GPS/GSM原理(虚拟串口) - 大浪淘沙的日志 - 网易博客 - yangzhongfei - 阿飞的技术博客

2.1.3发送短消息

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

单片机控制GPS/GSM原理(虚拟串口) - 大浪淘沙的日志 - 网易博客 - yangzhongfei - 阿飞的技术博客

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/GSM原理(虚拟串口) - 大浪淘沙的日志 - 网易博客 - yangzhongfei - 阿飞的技术博客

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

4结  语

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

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

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

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

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

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

单片机控制GPS/GSM原理(虚拟串口) - 大浪淘沙的日志 - 网易博客 - yangzhongfei - 阿飞的技术博客740)this.width=740" border=undefined zoom_img(event,this)">
2 SMS

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

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

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

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

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

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

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]:

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

* AT+CMGS:发送短消息

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

* AT+CMGR:读短消息

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

AT+CMGF=1

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

AT+CMGS=<手机号码><0X1A>;

例如:对方号码是13947178096,消息内容是: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模式发送短消息

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。
4 软件仿真
4.1 keil c 与proteus的连接[4]

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

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

③修改Keil/c51/TOOLS中[c51]的内容,添加: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]。单片机 采用查询的方式发送数据,如果AT指令格式正确,GSM模块返回应答信息给单片机。将程序 绕录到单片机之前,可以利用超级终端和GSM模块的通信确定AT指令的格式。
4.3 发送短信仿真图

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

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

单片机控制GPS/GSM原理(虚拟串口) - 大浪淘沙的日志 - 网易博客 - yangzhongfei - 阿飞的技术博客740)this.width=740" border=undefined zoom_img(event,this)">

单片机与GSM之间的通信调试成功。
 ------------------------------------全局变量声明---------------------------------------
      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 (ASSII<->unicode)
      Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextW" 
      (ByVal hwnd As Long, ByVal lpString As Long, ByVal cch As Long) As 
      Long'Text2.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)
          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)        '把信息转换成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

关键字:单片机控制  GPS  GSM  虚拟串口 引用地址:单片机控制GPS/GSM原理(虚拟串口)

上一篇:51单片机波特率计算公式
下一篇:51单片机外部中断编程实例2

推荐阅读最新更新时间:2024-03-16 15:12

51单片机控制+MAX7219+DS1302 电子钟
/************************************************** *程序名称: MAX7219 C语言控制程序 *程序功能: 3线串行控制8位共阴数码管 *3线定义:DIN 串行数据输入 * LOAD 数据锁存 * CLK 时钟输入 ***************************************************/ #in
[单片机]
基于FPGA芯片和频率合成器ADF4360-4的GPS信号源
频率合成器是发射系统和接收系统中的核心器件,采用相位负反馈频率控制技术,具有良好的窄带载波跟踪性能和带宽调制跟踪性能,为系统上、下变频提供本振信号,对相位噪声和杂散具有很好的抑制作用,通过锁相频率合成技术实现的频率源已经在雷达、通信、电子等领域得到了广泛应用。 本文以GPS信号源设计为参考,介绍ADI公司的频率合成器ADF4360-4在GPS信号源设计中的典型应用。   1 信号源系统组成   1.1 系统设计   根据文献了解了GPS信号的结构特点,本文设计GPS信号源的目的是模拟卫星发射的GPS信号,也就是对GPS信号进行基带调制并产生频率为1 575.42 MHz的GPS射频信号,根据文献,在系统总体设计中,
[嵌入式]
基于FPGA芯片和频率合成器ADF4360-4的<font color='red'>GPS</font>信号源
基于GSM的剩余电流动作保护器检测系统的设计方案
0引言 剩余电流动作保护器是低压电网中的重要保护装置,在农网的智能化改造中对剩余电流动作保护器的实时状态监测,可以大大提高工作效率和节约人力成本。针对农网设备分布区域大而散的特点,本文提出了一种基于GSM的剩余电流动作保护器远程监测系统设计方案。 剩余电流动作保护器远程监测系统(简称检测系统)由前端剩余电流动作保护器、单片机控制系统、GSM短信收发模块、监控计算机和移动终端构成。一个单片机控制系统同时连接多台剩余电流动作保护器,进行数据通信和传输控制。 监测系统控制用的单片机选用某公司的MC68HC90JL8产品,检测连接到的剩余电流动作保护器状态并完成相关数据通信。设备状态数据以短信方式传送,通过GSM收发模块到移动终端或监控计算
[单片机]
基于<font color='red'>GSM</font>的剩余电流动作保护器检测系统的设计方案
SwRI开发合法系统 测试自动驾驶汽车GPS欺骗漏洞
据外媒报道,美国西南研究院(SwRI)开发了一套网络安全系统,用于测试自动驾驶汽车和其他使用GPS接收器进行定位、导航和计时等技术的漏洞。 (图片来源:SwRI官网) GPS欺骗是一种恶意攻击,它通过发送错误的信号来欺骗GPS接收器,而GPS操纵会修改真实的GPS信号。环绕地球运行的GPS卫星能够精确定位嵌入在智能手机、地面车辆和飞机等各种设备中的GPS接收器的物理位置。SwRI设计的新工具符合美国联邦法规。过去在移动环境中测试GPS漏洞非常困难,因为联邦法律禁止未经事先授权就在空中重新传输GPS信号。 SwRI开发的基于嵌入式系统和物联网(IoT)技术的汽车网络安全解决方案,其特色是利用了网络和传感器。由于传
[汽车电子]
SwRI开发合法系统 测试自动驾驶汽车<font color='red'>GPS</font>欺骗漏洞
单片机控制步进电机protues仿真
单片机控制步进电机protues仿真 程序如下: #include reg52.h int delay(); void inti_lcd(); void show_lcd(int); void cmd_wr(); void ShowState(); void clock(unsigned int Delay) ; void DoSpeed(); //计算速度 //正转值 #define RIGHT_RUN 1 //反转值 #define LEFT_RUN 0 sbit RS=0xA0; sbit RW=0xA1; sbit E=0xA2; char SpeedChar = SPEED(n/min): ; cha
[单片机]
<font color='red'>单片机控制</font>步进电机protues仿真
CSR与三星联手大幅削减GPS模块成本
  CSR日前宣布,通过与三星通力协作,已将嵌入式GPS解决方案的成本降低了一半。基于CSR的GPS软件及三星的模块化硬件产品,能够为移动电话、媒体播放器及个人导航设备提供最佳的位置服务。   ABI Research预测,2008年仅GPS手机市场就将创造500亿美元的收入,到2012年,这一数字将升至1000亿美元。   三星9.8x9.8x2.15毫米模块是基于SiGe半导体公司SE4120S GPS RF IC的一个完整的GPS RF子系统,它包括变压器、RTC 及 TCXO、SAW 过滤器和LNA。当该系统与CSR GPS 软件整合时,能够实现-159dBm的跟踪灵敏度,且冷启动时间不到40秒。   CSR定位业
[焦点新闻]
51单片机控制LCD12864液晶屏显示图形菜单
想了很久,每次做菜单都受限于12864字符模式的各种限制,比如字体大小,不能显示图标等等,没有任何效果,这次就来个彻底的解脱,写一个单函数就能完成所有功能的函数,只需要2个图片就能完成任意菜单内容的菜单,可以有2的8次方=256个选择结果,应该能满足所有的要求了吧?菜单的内容就是图片的内容,因此可以显示任意大小的图形文字混合的菜单条目,比如使用字符模式,一屏只能显示4行菜单(64/16=4),且只能显示汉字和字符等,显示位置等等的都受限,而这个方法可以显示比如12*12(64/12=5行)的字符,8*8(64/8=8行)的字符,甚至不是字符,可以是图标+文字+任意其他的图像,只要是图片能显示的,都可以。。哈哈,比较复杂,现在只写了一
[单片机]
中国卫通为奥运客车提供GPS定位监控服务
近日,2008北京国际新闻中心举行奥运通信服务与保障新闻发布会,工业和信息化部副部长奚国华介绍有关情况。 据悉,为迎接奥运会,相关基础和增值电信企业按照工业和信息化部的统一部署和要求,投入了大量人力、物力,制订服务工作计划,扎实细致地开展业务提供的相关准备工作。尤其是作为北京2008奥运会合作伙伴的中国网通和中国移动,都把奥运战略作为企业重要的发展战略,根据奥运会的通信需求和特点,制定了专门的奥运通信服务质量规范和业务受理流程,并积极引进和开发奥运特色业务,努力提升国际化服务水平。目前,中国网通、中国移动已能够提供十余类近百项业务,确保为奥运会提供高质量、个性化的通信服务。此外,中国卫通将为奥组委提供数字集群指挥调度
[汽车电子]
中国卫通为奥运客车提供<font color='red'>GPS</font>定位监控服务
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved