Проблема с разбором данных, полученных по событию MSCOM в vb6

Работаю с GSM модемом. Я получаю данные о порте с особым синтаксисом для RING и сообщения, как для кольца

RING+CLIP: "+919860939518",145,"",,"",0

и для сообщения

+CMT: "BP-bytwoo",,"14/08/02,13:16:41+22 9860939518:hello6

Я создал гипертерминал в Textbox1, получая данные text1 в text3. Затем Сохранение данных в переменной с именем str. Затем ищем строки RING и +CMT в данных, извлеченных из text3 с помощью str_1 = Mid(Text3, 1, 6), и отображаем в text4.

Я могу извлечь слова RING и +CMT. Затем я проверяю, что если извлеченные данные равны RING, то извлеките число и отобразите его в текстовом поле2, или если извлеченные данные равны +CMT, то отобразите данные в текстовом поле 5.

Но даже если строки 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. Почему это так.


person user3678480    schedule 02.08.2014    source источник
comment
Каков ваш текущий код и с какими частями у вас сейчас проблемы?   -  person Hrqls    schedule 26.08.2014


Ответы (1)


В вашем коде у вас есть:

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

Проблема в том, что вы пытаетесь получить Mid$(str_1, 19, 13), когда str_1 равно "RING" или "+CMT" (т. е. никогда больше чем 4 символа). Вместо этого используйте 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
person johnwait    schedule 02.08.2014
comment
Спасибо, Джон. Проблема с str_1 возникла из-за копирования и вставки, я уже решил это. Как вы предложили, я использовал Left$, но при этом исходная строка, которую я хочу получить, также усекается до RING, а затем, используя Left$(Text3.text,4), я получаю только две буквы, RI. Но если я использую Left$(Text3.text,6), то я полностью получаю RING или +CMT. После этого также не выполняется условие IF-Else. Я проверяю простую строку, присутствует она или нет, и извлекаю соответствующую строку, но это тоже не работает. Интересно, почему условие If-Else не выполняется. - person user3678480; 04.08.2014
comment
Я использовал Трим, бесполезно. Testpos = InStr(1, Text3, RING) Text7 = Testpos ''''''-----------------------› Номер Testpos 3‹-- ------------------------- If (Testpos ‹› 0) Then str = Trim$(Text3) 'str_1 = Mid(Text3, 1, 6 ) str_1 = Left$(str, 6) Text4 = str_1 If (str_1 = RING) Then 'str = Left$(str, 19) 'Left$(str_1, 15) '----------- 22,10------------ Text3 = Trim$(Text3) str = Mid$(Text3, 19, 13) Text2 = str End If End If - person user3678480; 04.08.2014
comment
У вас есть два варианта: 1) вы должны либо выяснить, что представляют собой эти первые два символа (т.е. перед RING и +CMT), и разработать функцию, которая будет обрезать ваш ввод слева от них; или 2) всегда отбрасывать первые два символа из ввода модема. Я обновил ответ в отношении варианта 2 (т.е. взял символы с № 3 по № 6 текста в Text3) - person johnwait; 05.08.2014