分析vb6中MSCOM事件接收的数据时出现问题

分析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

我正在使用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
+CMT
,并在text4中显示

我能够提取单词
RING
+CMT
。然后,我检查是否提取的数据等于
RING
,然后提取数字并在文本框2中显示,或者如果提取的数据等于
+CMT
,则在文本框5中显示数据

但是,即使成功提取了string
RING
+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$()等
编辑:

从上面的所有内容来看,将输入抓取到Text3后的代码应该如下所示:

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),您当前的代码是什么,您现在遇到了哪些问题?