You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:VB6.0中使用D-LINK DWM-156 GSM Modem发送短信失败

嘿,我来帮你搞定这个短信发送的问题!先看了你贴的代码片段,发现几个关键问题可能导致发送失败,咱们一步步来修复:

代码里的核心问题

  • On Error Resume Next 掩盖了错误细节:这个语句会让程序跳过所有错误,你根本不知道是串口没打开、Modem没响应还是指令格式错了,先把它换成明确的错误捕获逻辑。
  • 没有等待Modem响应:AT指令发送后,Modem需要时间处理并返回结果,你连续发送指令的话,Modem可能还没处理完上一条就收到下一条,必然会出错。
  • CMGS指令缺少结束符:发送短信内容后,必须发送Chr(26)(也就是键盘上的Ctrl+Z)来告诉Modem结束输入,你的代码里漏掉了这关键一步。

修复后的完整代码示例

Private Sub cmdSend_Click()
    Dim response As String
    
    ' 启用错误捕获,方便排查问题
    On Error GoTo ErrorHandler
    
    ' 初始化串口对象(确保工程已引用MSComm控件)
    Set objcom = New MSComm
    
    With objcom
        .CommPort = txtPort.Text ' 比如COM3,要和Modem实际占用的端口一致
        .Settings = "9600,N,8,1" ' 该参数需匹配Modem默认配置
        .RTSEnable = True ' 部分Modem需要启用此选项才能正常通信
        .DTREnable = True
        .RThreshold = 1 ' 收到1个字符就触发OnComm事件
        .SThreshold = 0
        .InputLen = 0 ' 读取缓冲区所有内容
        .PortOpen = True
        
        ' 发送AT指令,测试Modem是否正常响应
        .Output = "AT" & vbCrLf
        WaitForResponse objcom, response
        If InStr(response, "OK") = 0 Then
            MsgBox "Modem无响应,请检查连接和端口!"
            GoTo Cleanup
        End If
        
        ' 设置短信为文本模式
        .Output = "AT+CMGF=1" & vbCrLf
        WaitForResponse objcom, response
        If InStr(response, "OK") = 0 Then
            MsgBox "无法设置文本模式!"
            GoTo Cleanup
        End If
        
        ' 发送短信目标号码指令
        .Output = "AT+CMGS=" & Chr(34) & Trim(txtNumber) & Chr(34) & vbCrLf
        WaitForResponse objcom, response
        ' 等待Modem返回">",表示可以输入短信内容
        If InStr(response, ">") = 0 Then
            MsgBox "Modem未准备好接收短信内容!"
            GoTo Cleanup
        End If
        
        ' 发送短信内容 + 结束符(Ctrl+Z)
        .Output = Trim(txtMessage.Text) & Chr(26)
        WaitForResponse objcom, response
        If InStr(response, "OK") > 0 Then
            MsgBox "短信发送成功!"
        Else
            MsgBox "短信发送失败,Modem响应:" & response
        End If
    End With

Cleanup:
    ' 清理资源
    If objcom.PortOpen Then objcom.PortOpen = False
    Set objcom = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "发生错误:" & Err.Description & " 错误代码:" & Err.Number
    GoTo Cleanup
End Sub

' 辅助函数:等待Modem响应,超时时间设为5秒
Private Sub WaitForResponse(comObj As MSComm, ByRef response As String)
    Dim startTime As Double
    startTime = Timer
    response = ""
    
    Do While Timer - startTime < 5 ' 5秒超时判断
        DoEvents ' 让程序处理其他事件,避免假死
        If comObj.InBufferCount > 0 Then
            response = response & comObj.Input
            ' 检查是否收到完整响应(通常以OK/ERROR/>结尾)
            If InStr(response, "OK") > 0 Or InStr(response, "ERROR") > 0 Or InStr(response, ">") > 0 Then
                Exit Do
            End If
        End If
    Loop
End Sub

额外调试建议

  • 先用串口调试助手验证Modem:比如用SSCOM这类工具连接Modem串口,手动发送AT指令测试:
    1. 发送AT,看是否返回OK
    2. 发送AT+CMGF=1,确认返回OK
    3. 发送AT+CMGS="目标手机号",等出现>后输入短信内容,再按Ctrl+Z,看是否返回OK
      如果这一步都失败,说明是Modem的连接或驱动问题,先解决硬件层面的问题。
  • 确认串口端口正确性:在设备管理器的“调制解调器”分类下,查看D-LINK DWM-156对应的端口号,确保txtPort.Text里的内容和它一致。

内容的提问来源于stack exchange,提问作者Paul Santiago

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:16:20