2015-08-06 4 views
1

В настоящее время я работаю над проектом, который включает в себя отправку и получение данных из serialport и tcp/ip.Выполнение последовательности команд из Ritchtextbox через цикл

Всякий раз, когда я получал сообщение с устройств, я выводил его в конец richtextbox, затем обрабатываю полученное сообщение соответственно, все это работает нормально, за исключением случаев, когда устройство отправляет несколько команд всего за 1 строку.

Например, устройство программно назначен отправить 1 команду в то время, что-то вроде этого:

MSTAT01P0K0S0^

MSTAT02P1K1S1^

MSTAT03P0K0S0^

MSTAT04P1K1S1^

Поскольку я получаю 1 команду за один раз, я могу добавить ее в мой последний конец richtextbox и легко обработать ее. Но иногда бывают случаи, что не позволяет устройству отправлять его 1 команду в то время, это будет рассматриваться как это

MSTAT01P0K0S0^ MSTAT02P1K1S1^ MSTAT03P0K0S0^ MSTAT04P1K1S1^

Вместо того, 4 строки кода в моем richtextbox У меня теперь есть 1 ссылка с 4 командами. Это моя проблема.

Вопрос: Как мне изменить код для обработки команд из последней строки richtextbox?

Note: Я могу определить начало и конец команд, которые я получил от устройства, указав M как начало и ^ в качестве конца.

У меня есть этот код:

Dim Sched_Num As String = String.Empty 
    Dim KS_Status As String = String.Empty 
    Dim SSR_Status As String = String.Empty 
    Dim Photocell_Status As String = String.Empty 

    Dim matches As MatchCollection = Regex.Matches(events_process, "(M[^\^]+\^)") 
    For Each m As Match In matches 
     For Each c As Capture In m.Captures 
      Dim CSTAT_Cmd As Boolean = events_process Like "MSTAT??P?K?S?^*" 
      If CSTAT_Cmd = True Then 
       Sched_Num = events_process.Substring(5, 2) 
       Photocell_Status = events_process.Substring(8, 1) 
       KS_Status = events_process.Substring(10, 1) 
       SSR_Status = events_process.Substring(12, 1) 
      End If 
     Next 
     Console.WriteLine(Sched_Num & " " & Photocell_Status & " " & KS_Status & " " & SSR_Status) 
    Next 

И это работает прекрасно, когда дело доходит до 1 команды в то время, проблема в том, когда устройство отправки ломтей команды.

Если я получил сообщение: MSTAT01P0K0S0^. Он выводит 01 0 0 0, что верно!

Если я получил сообщение: MSTAT01P0K0S0^MSTAT10P1K1S1. Он снова выводит 01 0 0 0.:(

ответ

2

Если я понимаю, что вы просите, когда вы находитесь внутри внутренней For Each, используйте Value свойство из объекта Capture вместо events_process так:

Imports System 
Imports System.Text.RegularExpressions 

Public Module Module1 

    Public Sub Main() 
     Dim events_process = "MSTAT01P0K0S0^ MSTAT02P1K1S1^ MSTAT03P0K0S0^ MSTAT04P1K1S1^" 
     Dim Sched_Num As String = String.Empty 
     Dim KS_Status As String = String.Empty 
     Dim SSR_Status As String = String.Empty 
     Dim Photocell_Status As String = String.Empty 
     Dim matches As MatchCollection = Regex.Matches(events_process, "(M[^\^]+\^)") 

     For Each m As Match In matches 
      For Each c As Capture In m.Captures 
       Dim CSTAT_Cmd As Boolean = c.Value Like "MSTAT??P?K?S?^*" 
       If CSTAT_Cmd = True Then 
        Sched_Num = c.Value.Substring(5, 2) 
        Photocell_Status = c.Value.Substring(8, 1) 
        KS_Status = c.Value.Substring(10, 1) 
        SSR_Status = c.Value.Substring(12, 1) 
        Console.WriteLine(Sched_Num & " " & Photocell_Status & " " & KS_Status & " " & SSR_Status) 
       End If 
      Next 
     Next 
    End Sub 
End Module 

Результаты:

01 0 0 0 
02 1 1 1 
03 0 0 0 
04 1 1 1 

Fiddle Demo

В действительности внутренняя For Each, не требуется. Вы можете просто использовать внешнее For Each с Value имущества от Match объекта

Imports System 
Imports System.Text.RegularExpressions 

Public Module Module1 

    Public Sub Main() 
     Dim events_process = "MSTAT01P0K0S0^ MSTAT02P1K1S1^ MSTAT03P0K0S0^ MSTAT04P1K1S1^" 
     Dim Sched_Num As String = String.Empty 
     Dim KS_Status As String = String.Empty 
     Dim SSR_Status As String = String.Empty 
     Dim Photocell_Status As String = String.Empty 

     Dim matches As MatchCollection = Regex.Matches(events_process, "(M[^\^]+\^)") 
     For Each m As Match In matches 
      Dim CSTAT_Cmd As Boolean = m.Value Like "MSTAT??P?K?S?^*" 
      If CSTAT_Cmd = True Then 
       Sched_Num = m.Value.Substring(5, 2) 
       Photocell_Status = m.Value.Substring(8, 1) 
       KS_Status = m.Value.Substring(10, 1) 
       SSR_Status = m.Value.Substring(12, 1) 
       Console.WriteLine(Sched_Num & " " & Photocell_Status & " " & KS_Status & " " & SSR_Status) 
      End If 
     Next 
    End Sub 
End Module 

Результаты:

01 0 0 0 
02 1 1 1 
03 0 0 0 
04 1 1 1 

Fiddle Demo

+0

Ты велик, это то, что я ищу. Спасибо огромное! Вы только что спасли мой день :) –

Смежные вопросы