Olá, Garagistas.

Estou com uma duvida, como desmontar uma String.

Conforme o exemplo abaixo é muito simples cria uma String porem não vejo solução para "desmontar"  na outra extremidade do circuito eu preciso ler esta String pela serial e armazenar o vetores.

Inicio

String = A;B;C;D;E;F;G 

Envia a pela Serial X

Serial Y e Desmonta a String A;B;C;D;E;F;G

A = 100  .   

A = 200   

A = 300 ...

// Assim por diante.

Fim

 

Acredito que o caminho seja conta as casa até ";" e ir separando!

Exemplo Funcionando

//Valores p/ montar a String
String StringValor;
int ValorA = (100);
int ValorB = (200);
int ValorC = (300);
int ValorD = (400);
int ValorE = (500);
int ValorF = (600);
int ValorG = (700);

void setup(){
Serial.begin(9600);

// Monta a String = A;B;C;D;E;F;G
StringValor=String(StringValor)+String(ValorA)+";"+String(ValorB)+";"+String(ValorC)+";"+String(ValorD)+";"+String(ValorE)+";"+String(ValorF)+";"+String(ValorG)+"\n";
}

void loop()
{
Serial.print("String = ");
Serial.println(StringValor);
}

Exibições: 5359

Responder esta

Respostas a este tópico

Lucas,

1 - Se seus valores serão sempre de 3 algarismos, e vc não precisa "conferir visualmente", fica fácil montar uma string única

char valor[21] = "100200300400500600700";

Depois é só receber e separar de 3 em 3 por meio de um laço FOR.

2 - Se a quantidade de caracteres dos valores varia, vc também pode trabalhar com inteiros:

int valor[] = {100,200,300,400,500,600,700};

Imprimir o Array com um Laço For... e Receber novamente num novo [], que poderá ser varrido pelo FOR e também transformado para inteiro.

Entretanto, não ficou bem claro o que vc quer fazer.

Vou listar um script que vc pode testar (escrevi em C++, mas não para arduino)

#include <Serial.h>

int valor_int[] = {100,200,300,400,500,600,700}; //para trabalhar com inteiros
char valor_char[] = "100200300400500600700"; //para trabalhar com cadeia de caracteres

//como não é python ;P

int size_int = sizeof(valor_int)/sizeof(int); //calcular o tamanho do array de inteiros
int size_char = sizeof(valor_char)/sizeof(char); //calcular o tama do array de caracteres

void setup(){

     Serial.begin(9600);

}

void loop(){

    for(int i=0;i<size_int;i++){
        Serial.print(valor_int[i]); //imprime cada um dos valores inteiros

    }

   //suponha que o resultado acima é uma cadeia de caracteres do tipo 100200300400500600700

   //então eu vou recebê-la pela Serial.read().

   //assim como o procedimento abaixo, posso quebrá-la, como abaixo:

    for(int i=0;i<size_char-2;i++){  //observe que o parametro do FOR é diferente do anterior.
          Serial.print(valor_char[i]);  //na primeira vez, imprime 1, na segunda 2, etc...

          Serial.print(valor_char[i++]); //incrementa e sempre vai imprimir o Zero depois do número.

          Serial.println(valor_char[i++]); //incrementa e imprime o 2º zero depois do número e quebrar a linha.
    }

}

Existem outros modos de percorrer uma cadeia de strings, retirando grupos de caracteres...

Entretanto...

Adapta pra sua situação e testa. Depois avisa se deu certo.

Edson muito obrigado pelas dicas, mais se estiver utilizando um valor flutuante e posso colocar nas String. pois os Valores A, B , C... é a leitura dos sensores de temperatura. 

Ex:. 23,72 //O correto é converter isso para interior longo certo!


 

 

Desculpe a demora, Lucas.

O tempo tá escasso... segue um código que vai listar os valores recebidos

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <Serial.h>
//by Edson E. Silva - softelli@gmail.com
//cole a linha abaixo no seu serial,
//como se tivesse sido transmitido pelo microcontrolador dos sensores
//23.1;25;34.6;100;1;0.5;3.765;

//esse código é do receptor:
int index;
String new_str[7]; //array de 7 posições
String tempString; //temporario
char a; //para armazenar o caracter da serial

void setup(){
  Serial.begin(9600);
}
void loop(){
  index = 0;
  while(Serial.available()){
      delay(100); //coloquei um retardo porque estava sujando minha serial
      tempString = " "; //Um espaço para esvaziar a string.
      while(true){
           a = Serial.read(); //leia um caractere
           if(a == ';') break; //ser for ponto-e-virgula, sai do while
           else tempString += a; //senao, adiciona na string temporaria
      }
      new_str[index] = tempString; //armazeno no array de strings, se for necessario utilizar adiante
      Serial.println(new_str[index]); // mostro esse conteúdo na Serial para verificação, somente.
      index++; //incremento o contador  
  }
}
//depois disso, é só capturar os valores dos índices 0 a 6 de new_str[] e convertê-lo em int, long ou float.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

Roda aí e nos informe o resultado.

Abraços.

Olá, amigo.

Muito obrigado pela ajuda Segue o código adaptado para minha aplicação. 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//http://labdegaragem.com/forum/topics/como-desmontar-uma-string?comm...
//by Edson E. Silva - softelli@gmail.com 08/11/12
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Em desenvolvimento 09/11/12 a ...
//by Lucas Fonseca - eletronicalmtec@gmail.com 08/11/12
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//Nova String
//#ID10#;27,90;94073;622;636;49,50;29,10;00/00/2012;10:22:48;1000;
// 60 caracteres

/*
#define STATE
#define VALOR_0
#define VALOR_1
#define VALOR_2
#define VALOR_3
#define VALOR_4
#define VALOR_5
#define VALOR_6
#define VALOR_7
#define VALOR_8
#define VALOR_9
*/


//esse código é do receptor:
int str_valor;
int str_dados;
String new_str[10]; //array de 7 posições
String tempString; //temporario
char a; //para armazenar o caracter da serial
String gardaserial;

String listdados[10]={
"*Conectado",
"Temperatura ",
"Pressao Atm",
"Altitude",
"Altitude Real",
"UR",
"Temp AR",
"Data",
"Hora",
"Sample Rate"
};
/*
char* listunidade[]={
(char*)223, //º
"C",
"Pa",
"Metros",
"Metros",
"%",
"*C",
"Data",
"Hora",
"Mili(s)"
};

char* params [] ={
"###",

*/

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6 , 5, 4, 3, 2);

//#include <NewSoftSerial.h>
///NewSoftSerial UbeeSerial(10,11);

//#include <Wire.h>
//unsigned long time;


void setup()
{

lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Terminal Remoto");
lcd.setCursor(2, 1);
lcd.print("Ubee Conexao");
delay(1000);
lcd.clear();


Serial.begin(19200);
// pinMode(13, OUTPUT);

}


// int contador = 0;
//int state;
int sample_rate = 600;



void loop(){


anima_display();
if (Serial.available()) {
// wait a bit for the entire message to arrive
delay(100);
lcd.clear();

while (Serial.available() > 0) {
decoder();

//delay(500);
//telas();

}
}
}



void telas()
{

//delay(2000); // Para dar tempo de ler a porta serial
decoder_0();
delay(sample_rate);
decoder_1();
delay(sample_rate);
decoder_2();
delay(sample_rate);
decoder_3();
delay(sample_rate);
decoder_4();
delay(sample_rate);
decoder_5();
decoder_6();
delay(sample_rate);
decoder_7();
delay(sample_rate);
decoder_8();
delay(sample_rate);
decoder_9();
delay(sample_rate);
}





/* void conta()
{

time = millis()/1000;
//lcd.print(time);
Serial.print(time);
Serial.print(": ");
}
*/
// Conectato
void decoder_0()
{

lcd.clear();
lcd.setCursor(4,0);
lcd.print(new_str[0]);
lcd.setCursor(3,1);
lcd.print(listdados[0]);
}
////////////////////////////////////////////////////////////////

// Temperatura
void decoder_1()
{
lcd.clear();
lcd.setCursor(2,0);
lcd.print(listdados[1]);
lcd.setCursor(3,1);
lcd.print(new_str[1]);
lcd.setCursor(11,1);
lcd.print((char)223); // Faz o simbolo de Graus
lcd.print("C");

}
////////////////////////////////////////////////////////////////

// Pressão Atm
void decoder_2()
{
lcd.clear();
lcd.setCursor(2,0);
lcd.print(listdados[2]);
lcd.setCursor(2,1);
lcd.print(new_str[2]);
lcd.setCursor(11,1);
lcd.print("Pa");

}
////////////////////////////////////////////////////////////////

// Altitude
void decoder_3()
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print(listdados[3]);
lcd.setCursor(3,1);
lcd.print(new_str[3]);
lcd.setCursor(8,1);
lcd.print("Metros");

}
////////////////////////////////////////////////////////////////

// Altitude Real
void decoder_4()
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(listdados[4]);
lcd.setCursor(3,1);
lcd.print(new_str[4]);
lcd.setCursor(8,1);
lcd.print("Metros");

}
////////////////////////////////////////////////////////////////

// Umidade Relativa UR
void decoder_5()
{
lcd.clear();
lcd.setCursor(3,0);
lcd.print(listdados[5]);
lcd.setCursor(0,1);
lcd.print(new_str[5]);
lcd.setCursor(6,1);
lcd.print("%");

}
////////////////////////////////////////////////////////////////

// Temperatura do AR
void decoder_6()
{
lcd.setCursor(8,0);
lcd.print(listdados[6]);
lcd.setCursor(8,1);
lcd.print(new_str[6]);
lcd.setCursor(13,1);
lcd.print((char)223); // Faz o simbolo de Graus
lcd.print("C");

}
////////////////////////////////////////////////////////////////

// Data
void decoder_7()
{
lcd.clear();
lcd.setCursor(6,0);
lcd.print(listdados[7]);
lcd.setCursor(2,1);
lcd.print(new_str[7]);

}
////////////////////////////////////////////////////////////////

// Hora
void decoder_8()
{
lcd.clear();
lcd.setCursor(6,0);
lcd.print(listdados[8]);
lcd.setCursor(3,1);
lcd.print(new_str[8]);

}
////////////////////////////////////////////////////////////////

// Sample rate
void decoder_9()
{
lcd.clear();
lcd.setCursor(2,0);
lcd.print(listdados[9]);
lcd.setCursor(1,1);
lcd.print(new_str[9]);
lcd.setCursor(9,1);
lcd.print("Mili(s)");

}
////////////////////////////////////////////////////////////////




void decoder()
{
str_valor = 0;
str_dados = 0;

lcd.setCursor(7,0);
lcd.print("OK");
delay(500);
telas();
lcd.clear();
while(Serial.available() > 0)

{
/*
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Atualizando");
lcd.setCursor(5,1);
lcd.print("Dados");
*/
delay(50); //coloquei um retardo porque estava sujando minha serial
tempString = " "; //Um espaço para esvaziar a string.
while(true)
{
a = Serial.read(); //leia um caractere


// falta adicionar um verificado de inicio e fim ### 23.1;25;34.6;100;1;0.5;3.765; ***

if (a == ';') break ;//ser for ponto-e-virgula, sai do while
else(tempString += a); //senao, adiciona na string temporaria

}


new_str[str_dados] = tempString; //armazeno no array de strings, se for necessario utilizar adiante

Serial.println((listdados[str_dados]) + new_str[str_valor]); // mostra esse conteúdo na Serial para verificação, somente.

str_dados++; //incremento o contador DADOS
str_valor++; //incremento o contador VALOR
//depois disso, é só capturar os valores dos índices 0 a 6 de new_str[] e convertê-lo em int, long ou float.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
}

}


void anima_display()
{
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Aguardando");
lcd.setCursor(0, 1);
lcd.print("((( Sinal )))");
{
delay(500);
for (int positionCounter = 0; positionCounter < 5; positionCounter++) {
lcd.scrollDisplayLeft();
delay(100);
}
for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
lcd.scrollDisplayRight();
delay(100);
}
for (int positionCounter = 0; positionCounter < 8; positionCounter++) {
lcd.scrollDisplayLeft();
delay(100);
}
//delay(2500);
}

}

Porem esta dano um errinho e to perdidinho pra achar onde esta o bug.

Eu envio #ID10#;27,90;94073;622;636;49,50;29,10;00/00/2012;10:22:48;1000; a cada 20 segundo.

*Conectado #ID10#
Temperatura 27,90
Pressao Atm 94073
Altitude 622
Altitude Real 636
UR 49,50
Temp AR 29,10
Data 00/00/2012
Hora 10:22:48
Sample Rate 1000

+ 27,9// Eco
*Conectado #ID10#
Temperatura 27,90
Pressao Atm 94073
Altitude 622
Altitude Real 636
UR 49,50
Temp AR 29,10
Data 00/00/2012
Hora 10:22:48
Sample Rate 1000
Rate 1000 // Eco
10 27,// Eco

Sera que isso é referente ao delay para limpar a serial?


Att

Problemas, Lucas.

1 - Não tenho o LCD pra debugar seu código;

2 - O VirtualBreadBoard não está ajudando muito.

Entretanto, recomendo que faça duas coisas:

1a - Rode o programa com a a função "anima_display()" desativada (comenta a chamada dela que está dentro do "void loop()") ou 

1b- dê um lcd.Clear();

2 -Dê uma somada nos seus "delay()".

Temos que combinar uma hora para um "toma lá da cá", talvez amanhã por volta de 20hs.

Se eu tiver sucesso no VBB eu posto aqui... mas covenhamos que seu código é extenso... vamos refatorá-lo! rsrsrsr

Qualquer coisa, me dá um toque no facebook: softelli@click21.com.br

Vou tentar realizar um vídeo pois desta for vai ajudar outros garagistas que estejam com duvidas semelhantes.


Hoje eu estou livre para o "toma lá da cá" lá pelas 22h.

Att

Algum progresso?

Olá ES, como vai?

Cara preciso algo parecido com isso mas não está dando certo.

Eu estou consultando um banco de dados onde tem horas cadastradas, pego esse resultado e armazeno em um cartão SD, apos isso eu precisaria interpretar essas horas no arduino. Então eu leio um arquivo txt no cartão, mas para comparar as horas que estão no cartao, preciso quebrar essa string e montar em uma variável do tipo Array para poder comparar, não estou conseguindo quebrar isso e depois comparar.

Não sei se me entendeu direito, mas gostaria de sua ajuda!

Dês de já agradeço!

MAP,

tudo bem?

No arquivo txt, há somente horas? (ou outros registros?)

um ou mais registros de horas?

no caso de vários registros, estão armazenados por linha?

qual o padrão/formato (Ex hh:mm:ss ou hh:mm, etc)

Acredito que vc possa colocar aqui um print do txt armazenado no cartão e das linhas da função que vc está utilizando para recuperá-lo.

ES, no txt tem somente horas no seguinte formato:
01:00

02:00

03:00

...

e assim por diante.

Queria que ficasse assim:

hora_1 = 01:00

hora_2 = 02:00

 e assim por diante, para poder comparar por exemplo

se hora_1 for == hora atual então dispara uma ação.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço