⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smstest.frm

📁 一个pc通过串口连接手机发送短信的测试程序
💻 FRM
📖 第 1 页 / 共 2 页
字号:
    ltem = Mid(num, ti, 1)
    rtem = Mid(num, ti + 1, 1)
    If ti = tl Then rtem = "F"
    ttem = ttem & rtem & ltem
  Next ti
  telc = ttem
End Function

Public Function teldec(num As String) As String  '收短信手机号码解码

  Dim tl As Integer
  Dim ltem, rtem, ttem As String
  Dim ti As Integer
      
  ttem = ""
  tl = Len(num)
  
  For ti = 1 To tl Step 2
    ltem = Mid(num, ti, 1)
    rtem = Mid(num, ti + 1, 1)
    ttem = ttem & rtem & ltem
  Next ti
  If Right(ttem, 1) = "F" Then
      ttem = Mid(ttem, 1, tl - 1)
  End If
  teldec = ttem
End Function

    


Function pdu_send(ByVal csca As String, ByVal num As String, ByVal msg As String) As String   'pdu编码和短信发送
 Dim pdu, psmsc, pnum, pmsg As String
  Dim leng As String
  Dim Length As Integer
Const prex = "0891"
Const midx = "11000D91"
Const sufx = "000800"
  Length = Len(msg)
  Length = 2 * Length
  leng = Hex(Length)
  If Length < 16 Then leng = "0" & leng
  psmsc = Trim(telc(csca))
  pnum = Trim(telc(num))
  pmsg = Trim(ascg(msg))
  pdu = prex & psmsc & midx & pnum & sufx & leng & pmsg
  
  '----------------------------------------------------
  
      
    If connect_status = True Then
       sleep (1)
       MSComm1.Output = "AT+CMGF=0" + vbCr
       sleep (1) '''''
       MSComm1.Output = "AT+CMGS=" & Str(15 + Length) + vbCr
       sleep (3)
       MSComm1.Output = pdu & Chr$(26)
       sleep (4)
       pdu_send = "1" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''需增加检测环节
    MsgBox "已发送 " + MSComm1.Input
    Else
    pdu_send = "0"
    MsgBox "串口未打开 "
    End If


End Function


Function pdu_decode(pdu_in As String, ByRef smsc_num As String, ByRef from_num As String, ByRef from_time As String, ByRef msg As String) As Integer   'pdu解码
Dim pdul, from_numl, msgl As Integer
Dim pdu As String

pdu = pdu_in
smsc_num = ""
from_num = ""
from_time = "'"
msg = ""

pdul = Len(pdu)

smscl = CInt(Val("&H" & Left(pdu, 2)))
smsc_num = teldec(Mid(pdu, 5, 2 * smscl - 2))
If Mid(pdu, 3, 2) = "91" Then
  smsc_num = "+" & smsc_num
End If

pdul = pdul - 2 * smscl - 2
pdu = Mid(pdu, 2 * smscl + 3, pdul)

from_numl = CInt(Val("&H" & Mid(pdu, 3, 2)))
If (from_numl Mod 2) <> 0 Then
  from_numl = from_numl + 1
End If
from_num = teldec(Mid(pdu, 7, from_numl))
If Left(from_num, 2) = "86" Then
  from_num = Right(from_num, Len(from_num) - 2)
End If

pdul = pdul - from_numl - 10
pdu = Mid(pdu, (from_numl + 11), pdul)

from_time = teldec(Left(pdu, 12))

pdul = pdul - 14
pdu = Mid(pdu, 15, pdul)

msgl = CInt(Val("&H" & Left(pdu, 2)))
If (pdul - 2) = msgl * 2 Then
  msg = chg(Mid(pdu, 3, pdul - 2))
  pdu_decode = 1
Else
  pdu_decode = 0
End If

End Function





    '因为手机同一时间只能处理一件事情,因此这个函数只负责发送短信,关于短信发送成功与否以及阅读短信的部分集中在一起处理。判断手机短信发送成功与否主要由AT+CMGS命令执行以后的返回码来决定(可参见前文的AT指令介绍部分)。

    '为了防止手机因过于繁忙而出错,这里采取了一定的方法让手机有充分的时间处理发送和接收及删除等操作。Sleep()函数正是为此而设计的,在发送及删除操作后都会让程序暂停一秒,这样就不至于使得手机过于繁忙。

    Public Function sleep(tt As Integer) As Integer
       For r = 0 To tt
        For i = 1 To 100
          For j = 1 To 10000
            k = j
            Next j
            Next i
          Next r
          sleep = 1

    End Function





Private Sub find_sms_in_Click()  '启用接收中断提醒功能
    If connect_status = False Then
    MsgBox "请先连接串口!"
    Exit Sub
  End If
  If find_sms_in.Value = 1 Then

    MSComm1.Output = "AT+CNMI=1,1,0,2,1" + Chr(13) + Chr(10)

   Else

     MSComm1.Output = "AT+CNMI=0,0,0,0,1" + Chr(13) + Chr(10)

   End If
    
End Sub

Private Sub com_connect_Click()    '打开串口
 Dim resp As String
 Dim outstring As String
 
 
 'If SmsOpen(2, "19200,n,8,1") = True Then
  If SmsOpen(CInt(com_num.Text), com_set.Text) = True Then

        MSComm1.Output = "ATE0" + Chr(13) + Chr(10) '关闭回显
         sleep (3)
        resp = MSComm1.Input
        MSComm1.Output = "AT" + Chr(13) + Chr(10) '测试连接正常
         sleep (3)
        resp = MSComm1.Input
        If resp = (Chr(13) + Chr(10) + "OK" + Chr(13) + Chr(10)) Then
           MsgBox "串口成功连接!"
           connect_status = True
           MSComm1.RThreshold = 1 '开串口接收中断
             sleep (10)
           
           MSComm1.Output = "AT+CPMS = ""MT"", ""MT"", ""MT""" + Chr(13) + Chr(10) '短消息接受后存在手机上??
           sleep (3)
           Exit Sub
        End If
  End If
  MsgBox "串口连接失败!"
End Sub


Function SmsOpen(Port As Integer, Setings As String) As Integer     '串口初始化

On Error GoTo ErrHandle
    SmsOpen = False
    If MSComm1.PortOpen Then MSComm1.PortOpen = False
    MSComm1.CommPort = Port
    MSComm1.Settings = Setings
    MSComm1.InBufferSize = 10000
    MSComm1.InputMode = comInputModeText  '
    MSComm1.InBufferCount = 0  '清除接收缓冲区
    MSComm1.OutBufferCount = 0 '清除发送缓冲区
    MSComm1.RThreshold = 0     '关串口接收中断
    
    MSComm1.PortOpen = True
  
    If MSComm1.PortOpen Then
        SmsOpen = True
    End If
Exit Function
ErrHandle:
   MsgBox "错误:  " + Str(Err.Number) + Chr(13) + Chr(10) + Err.Description, _
          vbOKOnly + vbCritical, App.Title
End Function


Private Sub com_disconnect_Click()    '关闭串口
     If MSComm1.PortOpen = True Then
         MSComm1.PortOpen = False
     End If
         
      MsgBox "端口已关闭"
      connect_status = False
End Sub




Private Sub Form_Load()
 


 connect_status = False
 find_sms_in.Value = 0


End Sub


Private Sub MSComm1_OnComm()   '有通讯事件发生(接受数据)
Dim dd As String

Select Case MSComm1.CommEvent

Case comEvReceive '...有接受事件发生
  'MSComm1.RThreshold = 0 '关串口接收中断
  sleep (3)
  dd = MSComm1.Input
'  sms_receive.Text = sms_receive.Text & dd & vbCrLf
  
  'at_receive_temp = at_receive_temp + MSComm1.Input
  at_receive_temp = at_receive_temp + dd
  
       If InStr(at_receive_temp, "OK" & vbCrLf) <> 0 Or InStr(at_receive_temp, "ERROR" & vbCrLf) <> 0 Or InStr(at_receive_temp, vbCrLf & "+CMTI: """) <> 0 Then '收完后
                
                at_receive = at_receive_temp
                com_out.Text = at_receive
                at_receive_ready = 1
                at_receive_temp = ""
                com_receive_output (at_receive)
                                
            End If
  
          
            
  'MSComm1.RThreshold = 1 '开串口接收中断'''''
Case Else
  MsgBox "串口通信出错"

End Select
End Sub

Private Sub send_at_Click()   '发送at命令

  If connect_status = False Then
    MsgBox "请先连接串口!"
    Exit Sub
  End If

  MSComm1.InBufferCount = 0  '清除接收缓冲区
  MSComm1.Output = Trim(com_in.Text) + Chr(13) + Chr(10)
End Sub

Private Sub sms_del_Click()

  If connect_status = False Then
    MsgBox "请先连接串口!"
    Exit Sub
  End If

    MSComm1.Output = "AT+CMGD=" + del_index.Text + Chr(13) + Chr(10)
    sleep (3)
    MsgBox "短信删除成功!"
    MSComm1.InBufferCount = 0  '清除接收缓冲区
    MSComm1.Output = "AT+CMGL=1" + Chr(13) + Chr(10)
    
End Sub

Private Sub sms_get_Click()


  If connect_status = False Then
    MsgBox "请先连接串口!"
    Exit Sub
  End If
  
  at_receive_ready = 0
  at_receive = ""

  MSComm1.InBufferCount = 0  '清除接收缓冲区
  MSComm1.Output = "AT+CMGL=1" + Chr(13) + Chr(10)


End Sub


Private Sub com_receive_output(ByVal at_receive As String)
  Dim at_head As String
  Dim at_tail As String
  Dim sms(5) As String
  
 Dim smsc_num As String
 Dim from_num As String
 Dim from_time As String
 Dim msg As String
   
  If InStr(at_receive, "+CMTI: ""MT"",") > 0 Then '收到新信息提醒,直接查询新信息
    'Call sms_get_Click
    MSComm1.InBufferCount = 0  '清除接收缓冲区
    MSComm1.Output = "AT+CMGL=0" + Chr(13) + Chr(10)
  End If
  
  If InStr(at_receive, "+CMGL:") > 0 And InStr(at_receive, "OK" & vbCrLf) Then '接收到短消息
    at_tail = at_receive
    'sms_receive.Text = ""
       
    Do Until (at_tail = "OK" & vbCrLf)
    at_head = StrHead(at_tail, vbCrLf)
    If InStr(at_head, "+CMGL:") Then
           sms(1) = Mid(at_head, 7, InStr(at_head, ",") - 7)
           at_head = StrHead(at_tail, vbCrLf)
           If pdu_decode(at_head, smsc_num, from_num, from_time, msg) = 1 Then
                   sms(2) = smsc_num
                   sms(3) = from_num
                   sms(4) = from_time
                   sms(5) = msg
            End If
            sms_receive.Text = sms(1) + "," + sms(2) + "," + sms(3) + "," + sms(4) + "," + sms(5) + vbCrLf + sms_receive.Text
   End If
   Loop
   End If
End Sub




Private Sub smssend_Click()  '发送一条信息
   Dim smsccc, numb, smsmsg As String
   Dim result As Boolean
    smsccc = Trim(smsc.Text)
    numb = Trim(tonumber.Text)
    smsmsg = Trim(sms_send.Text)
   result = pdu_send(smsccc, numb, smsmsg)

End Sub

Public Function StrHead(ss As String, ByVal c As String) As String
    Dim i As Long
    
    i = InStr(ss, c)
    If i > 0 Then
        StrHead = Mid(ss, 1, i - 1)
        ss = Mid(ss, i + Len(c))
    Else
        StrHead = ss
        ss = ""
    End If
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -