下面是我写的一段VB程序,COM1口已经打开,Unicode编码没有问题(在超级终端中可以正确发送短信息)。
出现的问题:当前这段程序运行时总是进入死循环,这表示运行结果中没有返回“OK”或“ERROR”,这是为什么?Private Sub Command4_Click()
    Dim doev
    Dim sendmess As Boolean
    Dim send_str As String
    Dim length As String
    Dim buffer_str As String
    
    flag_auto = False
    flag_user = False
    sendmess = False
    Timer1.Enabled = True
    
    length = Len("你好") * 2
    MSComm1.InBufferCount = 0
    MSComm1.Output = "AT+CMGS=" + Str(15 + length * 2) + vbCr
    '以下为短信内容的Unicode编码,保证正确,可以略过。
    send_str = "08"  'SMSC地址信息的长度
    send_str = send_str + "91"  'SMSC地址格式(TON/NPI)
    send_str = send_str + "683110902805f0"  'SMSC地址
    send_str = send_str + "11"  '基本参数(TP-MTI/VFP)( 发送,接收为84)
    send_str = send_str + "00"  'MR Message Reference
    send_str = send_str + "0D"  '目标SIM卡号码长度
    send_str = send_str + "91"  '同上
    send_str = send_str + "683100899109f0"  '对方手机SIM卡号
    send_str = send_str + "00"  '普通GSM类型,点到点方式
    send_str = send_str + "08"  'UCS2编码
    send_str = send_str + "00"  '有效期
    send_str = send_str + "04"  '用户信息长度
    send_str = send_str + "4F60597D"  '用户信息Unicode编码
    send_str = send_str + Chr$(26)  'Ctrl+Z
    '  Unicode编码结束
    MSComm1.Output = send_str
    Do  '这里好像有问题
        doev = DoEvents()
    
        If MSComm1.InBufferCount Then
            buffer_str = MSComm1.Input
            If InStr(buffer_str, "OK") Then
                sendmess = True
                Timer1.Enabled = False
                Exit Do
            ElseIf InStr(buffer_str, "ERROR") Then
                sendmess = False
                Timer1.Enabled = False
                Exit Do
            End If
        End If
    Loop
    If sendmess Then
        StatusBar1.SimpleText = "短信发送成功!!"
    Else
        StatusBar1.SimpleText = "短信发送失败!!"
    End If
    MSComm1.PortOpen = False
End Sub

解决方案 »

  1.   

    可能是你Timer1控件中的代码有问题,你列出来看一下
      

  2.   

    完整的代码
    Private Sub Command4_Click()
        Dim doev
        Dim sendmess As Boolean
        Dim send_str As String
        Dim length As String
        Dim buffer_str As String
        
        flag_auto = False
        flag_user = False
        sendmess = False
        Timer1.Enabled = True
        
        length = Len("你好") * 2
        'MSComm1.InBufferCount = 0
        MSComm1.Output = "AT+CMGS=" + Str(15 + length * 2) + vbCr
        
        send_str = "08"  'SMSC地址信息的长度
        send_str = send_str + "91"  'SMSC地址格式(TON/NPI)
        send_str = send_str + "683110902805f0"  'SMSC地址
        send_str = send_str + "11"  '基本参数(TP-MTI/VFP)( 发送,接收为84)
        send_str = send_str + "00"  'MR Message Reference
        send_str = send_str + "0D"  '目标SIM卡号码长度
        send_str = send_str + "91"  '同上
        send_str = send_str + "683100899109f0"  '对方手机SIM卡号
        send_str = send_str + "00"  '普通GSM类型,点到点方式
        send_str = send_str + "08"  'UCS2编码
        send_str = send_str + "00"  '有效期
        send_str = send_str + "04"  '用户信息长度
        send_str = send_str + "4F60597D"  '用户信息Unicode编码
        send_str = send_str + Chr$(26)  'Ctrl+Z
        MSComm1.Output = send_str
        StatusBar1.SimpleText = "正在发送短信..."
        Do
            doev = DoEvents()
            
            If MSComm1.InBufferCount Then
                buffer_str = MSComm1.Input
                If InStr(buffer_str, "OK") Then
                    sendmess = True
                    Timer1.Enabled = False
                    Exit Do
                ElseIf InStr(buffer_str, "ERROR") Then
                    sendmess = False
                    Timer1.Enabled = False
                    Exit Do
                End If
            End If
            Text1.Text = Text1.Text & Chr$(13) & buffer_str$
            If flag_auto Then
                flag_auto = False
                Exit Do
            End If
            
        Loop
        If sendmess Then
            StatusBar1.SimpleText = "短信发送成功!!"
        Else
            StatusBar1.SimpleText = "短信发送失败!!"
        End If
        MSComm1.PortOpen = False
    End SubPrivate Sub Timer1_Timer()
        flag_auto = True
    End Sub
      

  3.   

    这是我的端口检测程序,你可以参考一下,如果感兴趣,我可以把端口收发的源程序给你。
    [email protected]
    ----------------------------------------------------------------------------
    Private Sub Form_Activate()
    If MSComm1.PortOpen Then
       MsgBox "端口打开错误或程序已经开启,系统不能自动接收话单,这将造成话单数据的丢失,请重新检测端口设置,并重新启动计算机!", vbOKOnly, "吉大信息公司"
         Unload Me
    Else
       MSComm1.PortOpen = True
       Do While True
           If MSComm1.InBufferCount Then
             InString = InString & MSComm1.Input
                If InStr(InString, Chr(13) + Chr(10)) Then
                    List1.AddItem InString
                    List1.ListIndex = List1.ListCount - 1
                    InString = ""
                    DoEvents
                End If
            End If
           DoEvents
        Loop
    End If
    End Sub
      

  4.   

    To planetike(阿胜) :
       可否发送我一份,学习!谢谢!
       [email protected]
      

  5.   

    buffer_str = MSComm1.Input只是当前接收的,最好用跟楼上相似的
    buffer_str = buffer_str & MSComm1.Input
    另外,你这样循环查询,不如用oncomm()事件驱动接收。
      

  6.   

    非常感谢 planetike(阿胜) 帮忙。
    to: lilimaoming(嗷嗷)
    我刚接触VB没多久,还不太会用,我看了msdn也没看明白到底要用oncomm()中的哪一项来驱动接收,麻烦您说的具体一些好吗?多谢
      

  7.   

    你直接将事件的处理放在oncomm事件中,设rthreshold=1,受到一个字符则触发oncomm事件,
    还有相应的属性设置
      

  8.   

    1.设置mscomm的rthreshold为接收字符串长度
    2.在oncomm事件中添加如下代码:
    Private Sub MSComm_OnComm()
    Select Case Com.CommEvent
        Case comEvReceive:
               (接收字符)
    End Select
    3.改循环为:
    do while flag_auto=false
          doevents
    wend
    timer1.enable=false
    (判断字符串的正确性)
    做完以上三步应该ok,如不行继续发贴告诉我.
    祝你成功!
      

  9.   

    Do  '这里好像有问题
            doev = DoEvents()
        
            If MSComm1.InBufferCount Then
                buffer_str = buffer_str & MSComm1.Input
                If InStr(buffer_str, "OK") Then
                    sendmess = True
                    Timer1.Enabled = False
                    Exit Do
                ElseIf InStr(buffer_str, "ERROR") Then
                    sendmess = False
                    Timer1.Enabled = False
                    Exit Do
                End If
            End If
        Loop