求助:VB6.0中使用D-LINK DWM-156 GSM Modem发送短信失败
解决VB6中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指令测试:
- 发送
AT,看是否返回OK - 发送
AT+CMGF=1,确认返回OK - 发送
AT+CMGS="目标手机号",等出现>后输入短信内容,再按Ctrl+Z,看是否返回OK
如果这一步都失败,说明是Modem的连接或驱动问题,先解决硬件层面的问题。
- 发送
- 确认串口端口正确性:在设备管理器的“调制解调器”分类下,查看D-LINK DWM-156对应的端口号,确保
txtPort.Text里的内容和它一致。
内容的提问来源于stack exchange,提问作者Paul Santiago
相关产品推荐
相关产品推荐

