Ir ao conteúdo

Posts recomendados

Postado

Olá, glra...gente, alguém sabe como faço pra receber uma string com valores de vários sensores e desmontá-la a partir de caracteres delimitadores?

 

Por exemplo estou enviando pela Serial do Arduino ao Esp01 a seguinte string:

 "#34;54;67;99*"

Onde # delimita inicio, ; separa os valores e * indica o fim da string...preciso receber os valores sempre numa mesma ordem.

Se alguém puder ajudar agradeço..

  • Obrigado 1
Postado

@WMAC   creio que você possa pegar os caracteres da string ,  que são os  caracteres ASCII , e que vão de zero até 255 ,  assim
    você desmembra a string caractere por caractere .    e para isso informe a posição da string e verifique    se é '#' ( o que está entre aspas simples é caractere)    ou '*' o fim dessa string .    ou ';' ponto_e_virgula    e então um código poderia assim :

void setup() {
  /*
    "#34;54;67;99*"
    os caracteres ASCII vão de zero até 255 ,  assim
    você desmembra a string caractere por caractere .
    e para isso informe a posição da string e verifique
    se é '#' ( o que está entre aspas simples é caractere)
    ou '*' o fum dessa string .
    ou ';' ponto_e_virgula
    e então um código poderia assim :
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
/*int main()
{*/
    char string[15] = {"#34;54;67;99*"};
    char matriz[10][6];
    char aux[6];
    int nums[10];
    int j = 0, cont = 0,
        k = 0;
    do
    {
        if(string[j] == '#' )                          // inicio da string , esse caractere será ignorado
        {
            printf("cerquilha , iniciO a string\n\n"); // escreve essa msg
        }
        else                                           // senão
        {
            if(string[j] == '*')                       // chegou ao final da string ?
            {
                break;                                 // sai do loop , pois terminou a string
            }
            if(string[j] != ';')                       // então é um dígito numerico
            {
                aux[cont] = string[j];                 // armazena em aux
                cont++;                                // incrementa o contador de caracteres de aux
            }
            else                                       // senão , então é ponto_e_virgula fim desse numero
            {
                aux[cont] = '\0';                      // armazena em aux o caractere nulo finalizador de string
                cont = 0;                              // contador para usar na variavel aux
                strcpy( matriz[k] , aux );             // guarda essa string em uma matriz na pos indicada por k
                nums[k] = atoi( aux );                 // guarda o númerodo tipo inteiro em nums , também na pos indicada por k
                k += 1;                                // incrementa k para indicar a próxima pos
            }
        }
        j++;                                           // incrementa j para ler o próximo caractere da string
    }while(string[j] != '*' );
    printf("numeros em string  |   | numeros inteiros\n");
    for(j=0; j<k; j++)
    {
        printf("\t%s <----   |   | ------> %d\n",matriz[j],nums[j]);
    }
    return 0;



}

void loop() {
  // put your main code here, to run repeatedly:

}

e com float's seria a mesma coisa porém você irá fazer mais uma comparação para ver se é ponto ,  e use essa função "ftoa"  criada pelo usuário  ,

https://www.clubedohardware.com.br/forums/topic/1555128-erro-ftoa-não-definido/?tab=comments#comment-8233892

Postado

@devair1010 Obrigada por responder, então a questão é que a string vai sendo recebida caractere por caractere na serial, e isso tá dificultando a implementação da lógica por mim uma vez que dependendo do tempo a string já tá pelo meio..

  • Obrigado 1
  • Membro VIP
Postado

Que tal se recebesse o pacote todo ou numa área de ram (buffer) maior que a string e avaliasse na memória e não "on line" a string?

Algo como:

apague o buffer

aguarde encher todo

veja se é caracter começador

monte até achar o separador

veja se é o finalizador

...😁

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!