使用AT+CUSD指令调用*99#查询本机号码出现尾数缺失问题
问题排查及修复方案
核心原因有4点:
- 串口读取逻辑错误:
Thread.Sleep(7000)+ReadExisting()的组合无法保证拿到完整的CUSD响应报文,1200波特率传输速率低,7秒时间不足以让全量报文完全写入串口缓冲区时,就会出现内容截断。 - 正则匹配规则不合理:当前正则
(?<=\:).+会匹配第一个冒号后的所有内容,不仅会误抓响应报文里的后续参数(比如你结果里的, 15),如果中间有非预期的分隔符也会提前截断匹配结果。 - 串口参数配置不全:仅配置了波特率和端口号,未明确设置校验位、数据位、停止位,参数不匹配会导致传输过程丢字符。
- 未校验响应完整性:没有判断CUSD响应是否完全接收就直接解析,自然会出现内容缺失。
修复代码示例
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 完整配置串口参数,8N1为绝大多数GSM模块的默认参数,可根据你的模块调整 Me.SerialPort1.PortName = "COM5" Me.SerialPort1.BaudRate = 1200 Me.SerialPort1.Parity = IO.Ports.Parity.None Me.SerialPort1.DataBits = 8 Me.SerialPort1.StopBits = IO.Ports.StopBits.One Me.SerialPort1.ReadTimeout = 10000 ' 设置10秒读超时 If Not SerialPort1.IsOpen Then SerialPort1.Open() End If ' 清空缓冲区避免旧数据干扰 SerialPort1.DiscardInBuffer() SerialPort1.DiscardOutBuffer() ' 发送AT指令 SerialPort1.WriteLine("AT+CUSD=1,""*99#"",15") ' 循环读取直到拿到完整响应,或触发超时 Dim response As String = "" Dim startTime As Date = Date.Now Do response &= SerialPort1.ReadExisting() ' 检测到CUSD响应结束标识+OK/ERROR就退出循环 If response.Contains("+CUSD:") AndAlso (response.Contains(vbCr & vbLf & "OK") OrElse response.Contains(vbCr & vbLf & "ERROR")) Then Exit Do End If If Date.Now.Subtract(startTime).TotalMilliseconds > 10000 Then RichTextBox1.Text = "查询超时" Return End If Threading.Thread.Sleep(200) ' 小间隔等待,避免CPU空转 Loop ' 修改正则,只匹配MSISDN标识后的纯数字串,避免误抓其他参数 Dim msisdnMatch = System.Text.RegularExpressions.Regex.Match(response, "(?<=MSISDN:\s*)\d+") If msisdnMatch.Success Then RichTextBox1.Text = msisdnMatch.Value Else RichTextBox1.Text = "未匹配到手机号,原始响应:" & response End If End Sub
额外验证点
如果修改后还是有问题,可直接打印完整的原始响应报文,确认是传输阶段丢包,还是解析阶段匹配错误,方便定位具体问题。
内容的提问来源于stack exchange,提问作者Labyrinthe
相关产品推荐
相关产品推荐

