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?
Tags:
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 acimaString 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!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por