Filtro de valores em um array através de Expressões regulares

Boa tarde garagistas:

Após mandar uma String que é uma palavra chave de comando ao meu Arduino pela porta serial,estou tentando pegar valores e uma determinada string e coloca-los em dois arrays diferentes utilizando expressões regulares, no entanto esta dando o seguinte erro na marca vermelha no codigo abaixo:"A cadeia de caracteres de entrada não estava em um formato incorreto."

Segue o codigo em anexo  abaixo:

Se puderem ajudar, agradeço.

void SerialPort1DataReceived(object sender, SerialDataReceivedEventArgs e)
{

RxString += serialPort1.ReadExisting(); //le o dado disponível na serial.Sempre recebe os dados adicionandono final do buffer
if (RxString.StartsWith("@"))
{
this.Invoke(new EventHandler(trataDadoRecebidoComandSimples)); //chama outra thread para escrever o feedback de comando realizado com sucesso no text box
}
if (RxString.StartsWith("#"))
{
this.Invoke(new EventHandler(trataDadoRecebidoComandDistancia)); //chama outra thread para escrever o feedback de comando realizado com sucesso no text box
}
}
public void limpaStringComandos()
{

}

public void trataDadoRecebidoComandSimples(object sender, EventArgs e)
{
//depois de receber os dados verifica se possui uma mensagem completa nele, ou seja, o feedback do arduino que o comando foi realizado com sucesso. Ex: Navio 01 Leme a vante executado com sucesso - (OKNULAV)
//devemos fazer isso em um loop pois pode acontecer de chegar mais de uma mensagem ao mesmo tempo

int identificador = 0;
while ((identificador = RxString.IndexOf('@')) >= 0)
{
txtMonitor.Text = RxString;
//separamos a primeira mensagem do identificador sem o delimitador
string mensagem = RxString.Substring(0, identificador);
//tratamos ela da forma que for necessário, no caso, alimentar o txtDistancia com a informação limpa de acumulos de dados.
txtStatus.Text = mensagem;
//por fim removemos ela do buffer
RxString = RxString.Substring(identificador + 1);
}

}
public void trataDadoRecebidoComandDistancia(object sender, EventArgs e)
{
int identificador = 0;
while ((identificador = RxString.IndexOf('#')) >= 0)
{
string patternDistancia = @"^\#[A-Z]{1,7}\r\n\#[A-Z]{1,9}\#";//Retira os caracteres excedentes e deixa no array somente "numero#" ex.: 17#17#18#...
string patternDistanciaRetorno = @"^\#[A-Z]{1,7}([0-9]{1,3}\#){10}";//Retira os caracteres excedentes e deixa no array somente "#feedback do Arduino#" ex.: #OKNUSAPRO#
Match m = Regex.Match(RxString, patternDistancia);
while (m.Success)
{
m = m.NextMatch();
}
string[] SDistancia = Regex.Split(RxString, patternDistancia, RegexOptions.IgnoreCase);
string[] SRetorno = Regex.Split(RxString, patternDistanciaRetorno, RegexOptions.IgnoreCase);
string SString = string.Concat(SDistancia);
string SStringRetorno = string.Concat(SRetorno);
String[] SVetor = SString.Split('#');
int cont = 0;
int media = 0;
int soma = 0;
for (int n = 0; n <= 9; n++)
{
cont = cont + 1;
int caracter = Int32.Parse(SVetor[n]);// aqui ocorre o erro
soma += Convert.ToInt32(caracter);
}
media = soma / cont;
txtDistancia.Text = media.ToString();
txtMonitor.Text = RxString;
//separamos a primeira mensagem do identificador sem o delimitador
string mensagem = SStringRetorno.Substring(0, identificador);
//tratamos ela da forma que for necessário, no caso, alimentar o txtDistancia com a informação limpa de acumulos de dados.
txtStatus.Text = mensagem;
//por fim removemos ela do buffer
SStringRetorno = SStringRetorno.Substring(identificador + 1);
}
}
}

Exibições: 840

Anexos

Responder esta

Respostas a este tópico

Sergio, boa noite!

Não tenho como testar o seu código agora, mas já aconteceu comigo de o split trazer um elemento de array nulo e nesse caso provocaria esse erro que vc relatou.

Teste se o elemento do vetor veio nulo ou vazio

Tente  colocar a seguinte condição dentro do seu for:

for (int n = 0; n <= 9; n++)
{

if (!String.IsNullOrEmpty([SVetor[n])) {

    cont = cont + 1;
    int caracter = Int32.Parse(SVetor[n]);
    soma += Convert.ToInt32(caracter);

   }
}


Procure debugar o código para descobrir o seguinte:
O que veio na String SString?
Quanto elementos tem o vetor SVetor e quais são eles?
Espero ter ajudado. Caso não resolva avisa para testarmos as outras linhas


Jose Augusto Cintra.Realmente esta vindo elementos no meu array vazios e trazendo também as strings de retorno do Arduíno onde deveriam ser apenas valores numéricos de distancia.Vou testar com a sua informação e depois te aviso.Obrigado.

Augusto testei seu trecho de código e esta dando o mesmo erro...Este array SVetor só deveria ter informações de distancia com os delimitadores como: 7#8#9#7#..., no entanto esta armazenando tudo que vem pela serial e no inicio e fim do array esta vindo uma posição em branco.Segue arquivo anexo mostrando o debug.

Segue imagem do array com dados "errados"

Anexos

Nesse caso é a variável RxString que tem que ser tratada retirando os caracteres desnecessários.

Você fez isso com expressões regulares, mas por algum motivo não está dando certo.

Tenteretirar as expressões regulares e fazer o seguinte para limpar essa String deixando somente caracteres "#0123456789":

String novaString = "";

String caracteresValidos = "#0123456789";                                              

for(int x = 0; x < RxString.length(); x++){                   

  c = RxString.charAt(x);

  if (caracteresValidos.indexOf(c) >=0 ){

    novaString += c;

    }

  }

Pode ser que dê erro na concatenação de String com char, aí vc tem que converter c para String

no lugar desta variável caracteresValidos eu podeira colocar uma expressão regular para aceitar uma sequencia de dez números com os separadores # ?Pq estes números não são fixos, eles alteram todo o momento em que eu chamo este método e eu faço uma nova leitura do meu ultrassom.

Esse loop que te passei vai só limpar a variável rxstring.

Se ela contiver o valor "#123#abc12#75@#88OK#", a variável novaString vai ficar

"#123#12#75#88#"

Depois é só dar o split em cima dela

A variável caracteresvalidos é só uma auxiliar contendo os caracteres que o loop não pode limpar

Otimo, é isso mesmo que eu preciso, vou testar e retorno depois.Valeu.

Jose Augusto boa noite.

Resolvi esta questão, mas com o for colocado dava muito problema na performance, ou seja, ele demorava bastante para fazer a verificação de caracteres válidos e preenchia no array alguns valores NULL e colocava no array strings não numéricas.Ai quando ia calcular a média dava pau! Mas consegui resolver com o replace antes do calculo da média e retirada dos valores nulos do Array.

Obrigado pela ajuda.

Sérgio, Ok. Fico feliz que encontrou uma solução.

Abraço

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço