Olá galera, to me apertado aqui, pois com C ainda me enrolo, em outras linguagens já resolvi, o problema é serio!!

Queria receber dados assim na serial: 1,22,3333,4 e pegar cada numero separadamente, tipo quebrar as partes nas virgulas e tratar de cada valor separadamente.

  serial = 1,22,3333,4 

 

serial[0] = 1

serial[1] = 22

serial[2] = 3333

serial[3] = 4

Alguém  pode me ajudar neste código?

 

Exibições: 657

Responder esta

Respostas a este tópico

em PHP é facinho, correto? Basta vc quebrar onde há virgulas e gerar um array. No PHP bastaria dar o comando explode(",", $serial).

Pena que no C não tem isso.

Usando um pouco de imaginação, dá pra usar a técnica de detectar a posição da primeira vírgula. Dessa forma, o primeiro parâmetro vai da posição zero até a posição da primeira vírgula.

Depois vc manda localizar a posição da segunda vírgula, isto é, a primeira vírgula após a próxima casa onde está posicionada a primeira vírgula. Dessa forma, o segundo parâmetro vai da posição imediatamente após a primeira vírgula até a posição da segunda vírgula.

E assim sucessivamente, onde o último parâmetro inicia logo após a última vírgula e vai até o final da string.

String txtParams = "1,22,3333,4" ;

int _1stSeparator = txtParams.indexOf(','); // pega posição da 1ª virgula
int _2ndSeparator = txtParams.indexOf(',', _1stSeparator + 1); // pega a posição da 2ª virgula, ou seja, a primeira ocorrência de vírgula após a 1ª vírgula encontrada acima

String firstPortion = txtParams.substring(0, _1stSeparator); // obtém a 1ª substring

String secondPortion = txtParams.substring(_1stSeparator + 1, _2ndSeparator); // obtém a 2ª substring

a idéia é mais ou menos isso aí... tavez precise fazer pequenos ajustes, veja se funciona aí

da errro em tudo! uieaheiuahea 

mas entendi o caminho, vou tentar..

ajuda mais aew! :D

obrigado.

testei aqui e funcionou certinho... veja:

void setup() {
Serial.begin(9600);
String txtParams = "1,22,3333,4" ;
int _1stSeparator = txtParams.indexOf(','); // pega posição da 1ª virgula
int _2ndSeparator = txtParams.indexOf(',', _1stSeparator + 1); // pega a posição da 2ª virgula, ou seja, a primeira ocorrência de vírgula após a 1ª vírgula encontrada acima
String firstPortion = txtParams.substring(0, _1stSeparator); // obtém a 1ª substring
String secondPortion = txtParams.substring(_1stSeparator + 1, _2ndSeparator); // obtém a 2ª substring
Serial.println(firstPortion);
Serial.println(secondPortion);
}

void loop() {

}

a idéia funciona, o que precisa é dar continuidade pra obter o terceiro e quarto parâmetros

funcionou, obrigado... vou so agora pegar vindo da serial!

foi de infinita ajuda! 

Agradeço a ajuda!

resultado ficou:


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

void loop() {
receiveData();
}

// Valor de entrada na serial
// first,second,third,fourth
void receiveData() {

if (Serial.available() > 0) {

String txtParams = Serial.readString();

int _1stSeparator = txtParams.indexOf(','); // pega posição da 1ª virgula
int _2ndSeparator = txtParams.indexOf(',', _1stSeparator + 1); // pega a posição da 2ª virgula, ou seja, a primeira ocorrência de vírgula após a 1ª vírgula encontrada acima
int _3ndSeparator = txtParams.indexOf(',', _2ndSeparator + 2); // pega a posição da 3ª virgula, ou seja, a primeira ocorrência de vírgula após a 1ª vírgula encontrada acima
int _4ndSeparator = txtParams.indexOf(',', _3ndSeparator + 3); // pega a posição da 4ª virgula, ou seja, a primeira ocorrência de vírgula após a 1ª vírgula encontrada acima

String firstParams = txtParams.substring(0, _1stSeparator); // obtém a 1ª substring
String secondParams = txtParams.substring(_1stSeparator + 1, _2ndSeparator); // obtém a 2ª substring
String thirdParams = txtParams.substring(_2ndSeparator + 1, _3ndSeparator); // obtém a 3ª substring
String fourthParams = txtParams.substring(_3ndSeparator + 1, _4ndSeparator); // obtém a 4ª substring


Serial.println(firstParams);
Serial.println(secondParams);
Serial.println(thirdParams);
Serial.println(fourthParams);
}
}

isso não está errado não??? veja:

int _3ndSeparator = txtParams.indexOf(',', _2ndSeparator + 2); // pega a posição da 3ª virgula, ou seja, a primeira ocorrência de vírgula após a 1ª vírgula encontrada acima
int _4ndSeparator = txtParams.indexOf(',', _3ndSeparator + 3); // pega a posição da 4ª virgula, ou seja, a primeira ocorrência de vírgula após a 1ª vírgula encontrada acima

deveria ser:

int _3ndSeparator = txtParams.indexOf(',', _2ndSeparator + 1); // pega a posição da 3ª virgula, ou seja, a primeira ocorrência de vírgula após a 2ª vírgula encontrada acima
int _4ndSeparator = txtParams.indexOf(',', _3ndSeparator + 1); // pega a posição da 4ª virgula, ou seja, a primeira ocorrência de vírgula após a 3ª vírgula encontrada acima

se vc somar 2 ou 3 casas, vai dar zica caso a substring seja curta (1 ou 2 caracteres por exemplo). Mas se vc garante que a substring é maior que isso, vai funcionar sim

Interessante é que das duas maneiras funciona, so que fica lento..

 mas funciona os 2

é como te falei... se tua substring for de um caracter, vc não conseguirá capturá-la pois vc estará deslocando muito a busca, pra além do comprimento da  substring

se funcionou do jeito que vc fez, é porque a terceira substring é maior que 1 caracter e a quarta substring é maior que 2 caracteres

de qualquer forma, recomendo adicionar sempre +1 porque dessa forma vc garantirá sucesso em qualquer situação e evitará erros caso sua substring se encaixe nos casos citados

Cara, pode me ajudar com uma coisa.. o codigo ficou lento!

acho que esse String txtParams = Serial.readString();

trava, ou sei la. ele demora 1 a 2 segundos p ler o comando..

não tem como saber o que pode estar causando essa lentidão sem olhar teu código, mas talvez seja isso:

certifique-se de que vc não esteja "parseando" a string a cada loop do sketch. Isso consome recursos e pode estar aí teu problema.

Veja se não seria o caso de vc armazenar as informações vindas da serial numa string, acumulando (concatenando) caracter a caracter e só depois de finalizada a string txtParams, aí sim vc manda "parsear"

vc tentou usar a dica do colega Victor sobre parseInt()??? Veja que a dica dele funciona bem se vc garantir que precisará "parsear" apenas Int. Do jeito que eu te propus, dá pra "parsear" qualquer coisa

Com Arduino, só utilizar parseInt().

Obrigado pela dica, ficou excelente!

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2018   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço