Pessoal bom dia.Tenho a seguinte situação:Tenho uma string que o Arduíno manda para minha aplicação através da porta serial com o seguinte formato:

variável = #<valor de distancia de ultrassom>##<valor de distancia de ultrassom>#...(com 10 amostras iguais a esta).Preciso separar somente os números desta string, soma-las entre sí, calcular uma media simples sobre estes valores armazenado esta média em uma variável e mostrar em um textbox mostrar o valor.

Se alguém puder ajudar, agradeço.

Exibições: 2903

As respostas para este tópico estão encerradas.

Respostas a este tópico

  • Marcos, este post é bom mas eu tenho um problema... eu preciso selecionar somente 10 valores intermitentes, por exemplo:"#13##15##12##20##22##20##19##25##100##15##" e no caso eu poderei ter valores com 2 ou no máximo 3 casas decimais.Como posso fazer isto? será que com a função split consigo fazer?

  • preciso pegar estes numero e fazer uma média e armazenar esta média em uma vaviável

Me intrometendo no diálogo:

Em C#. pode-se usar expressões regulares para extrair os números da string.

Ou então, para o seu caso o melhor é usar o método Split de String. O método Split quebra a string em um array, com base em um delimitador, que nos eu caso é o "#", correto?
Depois de obter o array é só calcular a média dos valores que devem ser convertidos para int.

Por exemplo,
String S = "#222#33#4";
String [] vet = S.Split("#");

o resultado vai ser:

vet[0] = "222"
vet[1] = "33"
vet[2] = "4"

https://msdn.microsoft.com/pt-br/library/b873y76a%28v=vs.110%29.aspx

JAC, obrigado pelo retorno.

Vou digerir este link com estas informações que vc me passou e retorno com um resultado.Obrigado.

é mais ou menos isso:

#define ARRAY_SIZE 20
char *input = "#13##15##12##20##22##20##19##25##100##15##";
int intArray[ARRAY_SIZE];

int split(int *array, int arraySize, char *str, const char *s)
{
   char *token;
   /* get the first token */
   token = strtok(str, s);
   /* walk through other tokens */
   int i = 0;
   while( token != NULL )    {
      Serial.println( atoi(token) );
      array[i] = atoi(token);
      if (i++ == arraySize){
        i--;
        break;
      }
      token = strtok(NULL, s);
   }
   return (i);
}
void setup(){
  Serial.begin(9600);
  int n = split (intArray, ARRAY_SIZE, input, "#");
  for (int i=0; i<n; ){
    int tot = intArray[i] + intArray[i+1];
    Serial.print(intArray[i++]); Serial.print("+");
    Serial.print(intArray[i++]); Serial.print("=");
    Serial.println(tot);
  }
}
void loop(){
}

Vou adaptar para o codigo em C# e retorno.

Galera, obrigado pela boa vontade, mas consegui acha uma solução com as informações do colega Jose Augusto Cintra.Fiz uma adaptação no código onde mostra todos os elementos do array com o split.

Fiz uma adaptação também na String com os números...Só tenho um carácter no final do meu numero pois a aplicação capta todo que esta no inicio do carácter "#"

Segue o código fonte: (100% funcionando)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TesteStringArray
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btncalcular_Click(object sender, EventArgs e)
{
String S = "20#20#21#21#22#22#23#23#24#24#";
String [] Vetor = S.Split('#');
txtAmostra.Text = S;
txtVetor0.Text = Vetor[0];
txtVetor1.Text = Vetor[1];
txtVetor2.Text = Vetor[2];
txtVetor3.Text = Vetor[3];
txtVetor4.Text = Vetor[4];
txtVetor5.Text = Vetor[5];
txtVetor6.Text = Vetor[6];
txtVetor7.Text = Vetor[7];
txtVetor8.Text = Vetor[8];
txtVetor9.Text = Vetor[9];
int cont = 0;
int media = 0;
int soma = 0;

for (int n = 0; n < (Vetor.Length - 1); n++)
{
cont = cont + 1;
int caracter = int.Parse(Vetor[n]);
soma += Convert.ToInt32(caracter);
}
media = soma / cont;
txtMedia.Text = media.ToString();
}
}
}

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço