分析vb6中MSCOM事件接收的数据时出现问题
我正在使用GSM调制解调器。我在端口上获取数据,使用特殊语法表示环和类似于环的消息分析vb6中MSCOM事件接收的数据时出现问题,vb6,serial-port,at-command,Vb6,Serial Port,At Command,我正在使用GSM调制解调器。我在端口上获取数据,使用特殊语法表示环和类似于环的消息 RING+CLIP: "+919860939518",145,"",,"",0 和信息 +CMT: "BP-bytwoo",,"14/08/02,13:16:41+22 9860939518:hello6 我在Textbox1中创建了一个超级终端,在text3中获取text1的数据。然后将数据存储在名为str的变量中。然后使用str_1=Mid(text3,1,6)在从text3提取的数据中查找字符串RING
RING+CLIP: "+919860939518",145,"",,"",0
和信息
+CMT: "BP-bytwoo",,"14/08/02,13:16:41+22 9860939518:hello6
我在Textbox1中创建了一个超级终端,在text3中获取text1的数据。然后将数据存储在名为str
的变量中。然后使用str_1=Mid(text3,1,6)
在从text3提取的数据中查找字符串RING
和+CMT
,并在text4中显示
我能够提取单词RING
和+CMT
。然后,我检查是否提取的数据等于RING
,然后提取数字并在文本框2中显示,或者如果提取的数据等于+CMT
,则在文本框5中显示数据
但是,即使成功提取了stringRING
和+CMT
,我也无法检索必须显示在textbox2和textbox5中的电话号码。这些文本框完全不显示任何内容。我不明白为什么会这样。请引导我。这是我的密码
Dim str As String
Dim val As Integer
Dim str_1 As String
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Load()
'On Error GoTo errx:
Dim strValue As String ' define Buffer value from Modem
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.CommPort = 6 'comm port no.
MSComm1.Settings = "9600,n,8,1"
MSComm1.RThreshold = 1 'no. of chr to receive
MSComm1.SThreshold = 1
MSComm1.InputLen = 0 ' no. of chr on which oncomm event fires
'MSComm1.RTSEnable = True
'MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True 'open comm port
MSComm1.Output = "AT + CLIP = 1" + Chr(13)
Sleep 1000
'MSComm1.Output = "AT+CMGF=1" + Chr(13) '& Chr(10)
'Sleep 500
MSComm1.Output = "AT+CNMI=1,2,0,0,0" + Chr(13) '1,2,0,0,0
Sleep 1000
End If
'errx:
' MsgBox "error"
End Sub
Private Sub MSComm1_OnComm()
Static Buffer As String
t = Now() + timeout / 86400000#
If MSComm1.CommEvent = comEvReceive Then
Do
Text1 = Text1 + MSComm1.Input
If Now() > t Then Exit Do
Loop
Text3 = Text1
Text1 = ""
End If
str = Text3
str_1 = Mid(Text3, 1, 6)
Text4 = str_1
If (str_1 = "RING") Then
Text2.Text = Mid(str_1, 19, 13) 'Left$(str_1, 15)
ElseIf (str_1 = "+CMT") Then
Text5.Text = Mid(str_1, 19, 13) '19,13
Else
Exit Sub
End If
MSComm1.InBufferCount = 0
End Sub
编译器甚至没有进入循环If(str_1=“RING”)Then
。为什么会这样。在您的代码中,您有:
str = Text3
str_1 = Mid(Text3, 1, 6)
Text4 = str_1
If (str_1 = "RING") Then
Text2.Text = Mid(str_1, 19, 13) 'Left$(str_1, 15)
ElseIf (str_1 = "+CMT") Then
Text5.Text = Mid(str_1, 19, 13) '19,13
Else
Exit Sub
End If
问题是,当stru 1是“RING”或“+CMT”(即不超过4个字符)时,您试图获得Mid$(stru 1,19,13)。相反,使用str,如Mid$(str,19,13)。应该这样做
另外,为了确保If/Else子句确实有效,并且如果您的意图是包含3到6个字符(而不是6个字符),那么
str = Text3
str_1 = Mid(Text3, 1, 6)
Text4 = str_1
你应该吃点类似的东西
str = Text3.Text
str_1 = Mid$(str, 3, 4)
Text4.Text = str_1
你会看到我也做了风格修正:
- 不要依赖默认属性,而是将它们写出来(更清晰,这样人们一眼就能看出Text4不是一个变量或属性,而是一个对象)
- 使用Mid()、Left()等的强类型字符串版本,即Mid$()、Left$()等
str = Text3.Text
str_1 = Mid$(str, 3, 4)
Text4.Text = str_1
If (str_1 = "RING") Then
Text2.Text = Mid$(str, 19, 13) ' provided index 19 is still valid
ElseIf (str_1 = "+CMT") Then
Text5.Text = Mid$(str, 19, 13) ' provided index 19 is still valid
Else
Exit Sub
End If
Thanx John。stru_1的问题是由于复制粘贴,我已经解决了。正如你所建议的,我使用了Left$,但是我想要得到的原始字符串也被截断为RING,然后使用Left$(Text3.text,4)我只得到两个字母,RI。但是,如果我使用Left$(Text3.text,6),那么我将完全获得RING或+CMT。在那之后,如果其他条件失败的话。我正在检查一个简单的字符串是否存在,并提取相应的字符串,但这也不起作用。我不知道为什么如果其他条件是失败的。我用修剪,没有用。Testpos=InStr(1,Text3,“RING”)Text7=Testpos“number”是3您有两个选择:1)您必须找出前两个字符是什么(即在“RING”和“+CMT”之前),并设计一个函数,将从这些字符中删除您的输入;或2)始终丢弃调制解调器输入的前两个字符。我已经更新了选项2的答案(即在文本3中提取文本的字符3到字符6),您当前的代码是什么,您现在遇到了哪些问题?