Estou aprendendo a trabalhar com floats, preciso de ajuda

Olá pessoal estou com uma dúvida que é a seguinte eu tenho esse trecho de código para trabalhar com um GPS, nesse código ai ele já pega a latitude e longitude e envia certinho na variável buf, mas não consigo recuperar no outro lado o conteúdo da variável id, estou cometendo algum erro simples.

...

char buf[8]; //declaração da variavel de Buffer de transmissão (buf )
char id = "1.0"; //(Identificador único)

//agrupa os dados para envio

float gpsLL[3]={latitude,longitude,id}; //GPS

memcpy(buf,gpsLL,sizeof(gpsLL)); //copia float para buf[]

========

Do outro lado eu uso esses comandos e recupero os dados dentro das variáveis latitude e longitude certinho, mas já tentei mil formas de recuperar o id e simplesmente não consegui

float longitude = (*(float *)&buf[4]);
float latitude = (*(float *)buf);

Alguém saberia como declarar para recuperar esse conteúdo da variável id? Eu nunca tinha feito um código assim com float e to com muita dificuldade, para entender isso.

Essa variável buf é para transmissão por um radio lora com arduino, mas não influencia em nada é esse trecho ai que está causando o problema.

Exibições: 310

Responder esta

Respostas a este tópico

Bom dia EMF,

não entendi bem o que vc quis dizer com "outro lado".

Qual plataforma vc está usando?  Ou qual  linguagem está usando?  C++?
RV

É arduino com radio lorawam os dois lados, imagine a lorawam no lugar de um ESP12 ou uma placa de rede, só muda a modulação e o protocolo de envio.

boa noite Edilson.

        Como disse o Minerin, não são tão claras as informações que vc postou. Mas com algum esforço  de suposição, pode-se talvez conseguir algum entendimento lógico.

        Parece que vc está obtendo os dados de um GPS, e estes dados são do tipo "float", já que correspondem a cordenadas (tipo as do Google Maps). Estes dados estão no vetor "gpsLL", e são: a latitude, a longitude, e o "id". Pelo que entendi, o "id" também é um "float".

        Então você copia os dados do vetor "gpsLL", para o vetor "buf". No entanto este vetor "buf" é do tipo "char" (ou seja "byte"). Então vc envia os dados do vetor "buf" para algum lugar (não sei como nem para onde, já que vc não informa isso).

        Os dados são então recebidos no tal "outro lado" (só Deus e vc sabem que "lado" é esse), em um outro vetor "buf". Aí vc tem que "extrair" os dados do "buf", convertendo-os novamente para os "float" de cada variável (latitudelongitude, e o "id").

        Tendo-se "entendido" isso, vamos ao seu "código". Há alguns problemas com este seu código. Vou enumerar e explicar os problemas, e como resolver cada um deles. Segue:

        1) Uma varável tipo "char" é do tamanho de 1 byte. Um "float" no Arduino tem o tamanho de 4 bytes. Portanto não tem como vc armazenar um valor "float" em uma variável tipo "char". Assim o valor "1.0" do seu "id" deve também ser armazenado em uma variável "float". Logo isso fica assim:

         float id = 1.0;

        2) o seu vetor "buf" deve ter tamanho suficiente para armazenar todos os dados que vc quer enviar. Cada um dos seus dados é um "float", e cada "float" ocupa 4 bytes. Então o melhor é vc definir o número de dados ou elementos que vc quer enviar, e usar esse número para dimensionar o seu vetor "buf". Veja como isso é feito (colei um figura devido à formatação do texto aqui no post):

(clique na figura para "zoom")

        Veja que o número de elementos é 3. A constante "sizeof(float)" é igual a 4, que é o tamanho de um valor "float". Logo o vetor "buf" é definido com tamanho igual a 3x4, ou seja 12 bytes. Por que? simples: cada "float" que será armazenado em "buf" ocupará 4 bytes. Fazendo do jeito que mostrei acima, ao mudar a constante "Num_dados", automaticamente o vetor "buf" já será dimensionado com o tamanho suficiente para armazenar seus elementos (dados).

        Bem, vc já deve ter percebido que o dimensionamento de 8 bytes que vc tinha feito, não era suficiente para armazenar os todos os dados a serem copiados (inclusive este erro estava destruindo outros dados na memória do Arduíno, sem vc saber).

      3) o dimensionamento que vc fez do vetor "gpsLL", também não é o mais indicado. Já se a constante "Num_dados" é definida, o ideal então é definir o vetor "gpsLL" assim:

         float  gpsLL [ Num_dados] =  ....

       Observe, que assim, o número de elementos do vetor "gpsLL" já fica automaticamente ajustado para o número de dados "float" que ele irá conter.

      4) a forma como vc insere os dados (elementos) em "gpsLL" está correta, mas não é das mais versáteis dentro de um código (se possível, insira individualmente, como mostro no exemplo que anexei ao final do post). A cópia para do "gpsLL" para o "buf", também está correta, embora também não seja a mais "tradicional" (o ideal é fazer isso via um ponteiro de "float", mas isso é outra história).

      5) já do "outro lado", o vetor "buf" também deve ter sido definido exatamente como mostrei antes, a fim de que tenha tamanho suficiente para conter todos os dados que vc irá receber nele. Após ter recebido os dados, vc deve obtê-los como mostro a seguir:

       Veja que foi usado um índice chamado "elemento", que é uma variável "char". Com este índice acessamos os elementos individualmente no vetor "buf", sem precisar calcular o "offset" do vetor. Dentro dos colchetes, este "offset" é calculado automaticamente, conforme o elemento que vc acessa. Veja que a constante "sizeof(float)", será igual a 4, já que este é o tamanho de um "float". Pra vc entender o motivo de se estar subtraindo 1 do índice "elemento", é preciso que vc entenda como vetores funcionam na linguagem C/C++ (estude isso, e vc entenderá o motivo, que é bem simples).

       Uma observação final:  usar Ponteiros (não sei se vc percebeu, mas vc está usando), acrescenta um grau de sofisticação e versatilidade ao seu código. Mas é preciso saber usá-los corretamente, senão podem acontecer coisas "muito loucas" quando vc executar seu programa. Então tenha atenção a isso.

      No anexo ao fim do post, eu acrescentei um programa do Arduino que exemplifica o que vc está fazendo. As únicas partes que não tem, são o código que lê os dados do GPS e o que envia para algum lugar (o tal misterioso "outro lado").  Mas para o que vc postou, tudo que expliquei aqui eu coloquei no código, de forma organizada e coerente, a fim de facilitar o entendimento e uso.

     Espero ter ajudado, e caso tenha alguma dúvida não deixe de perguntar (mas leia antes o que vc escreve, para ter certeza de que deixou bem claro).

     Abrçs,

     Elcids

código exemplo que preparei:  simula_enviar_receber_floats_GPS_01.ino

Vou testar suas dicas, como descrevi ali no fim do post o outro lado é um rádio lorawan, ele vai por exemplo no lugar que você usaria um esp12 ou uma placa de rede no arduino, a unica diferença é a modulação que não é wirelles e o protocolo que não é tcpip, mas a transmissão não influencia no código por isso não quis colocar tudo, a linguagem que estou usando é a nativa da ide do arduino.  

Funcionou perfeitamente usando seu modelo. Parabéns. E obrigado por me sugerir o estudo de ponteiros.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço