Como construir (concat) uma string com números grandes

novo no Arduino Estou lutando com o que parece ser um problema bastante n00b … Eu conectei uma placa GPS adafruit para o meu Arduino e ela está funcionando enquanto envia dados GPS para a porta serial com Serial.print(GPS.latitude, DEC)

Agora quero concat uma string que posso processar (leia-se: desejo enviá-lo por meio de um cliente Ethernet.) Isso é o que já recebi:

...... String vnnt = "$VNNT,"; if (GPS.fix) { vnnt += "GPS,"; //this works: vnnt.concat(GPS.fix); //but this not: vnnt.concat(GPS.latitude); }else{ vnnt += "INFO,Acquiring Sats"; } Serial.println(vnnt); 

A mensagem de erro é: Call of overloaded "concat(float&)" is ambiguous Quando eu Serial.print(GPS.latitude, DEC) resulta em: 4418.5937996050

Então é provavelmente muito grande ou algo assim …

Como posso concatear os vars e criar a string longa?

Comentários

  • Aren ' Está faltando um ponto e vírgula?
  • e um diz vnnt enquanto outro diz vannut
  • Desculpe, algum erro de digitação ' s 🙂
  • Você conhece o tipo de dados de GPS.latitude? Por exemplo. é um float, int, etc.?
  • Acho que ' sa float? Diz float na mensagem de erro. Como posso descobrir? Existe um var_dump ou algo assim?

Resposta

A função concat não implementa uma versão float, mas alguns de char, int, unsigneds …

unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ... 

então o compilador não sabe como converter (provavelmente truncando o float) para um inteiro, pois existem vários opções.

Você deve primeiro converter seu float em string, usar dtostrf () ou sprintf () e então concatá-lo em sua string.

char outstr[25]; sprintf(outstr, "%f", GPS.latitude); 

ou

dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs 

E então:

vnnt.concat(outstr) 

Observe também que sprintf é muito útil para criação compacta de uma string (char):

char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude); 

Comentários

  • +1 em caso de dúvida, sprintf fora 🙂
  • Um ponto de cautela, porém: sprintf() é uma função complexa, portanto, é bastante lento e usa bastante memória. Geralmente, eu o evitaria para código de " produção " (manter apenas para fins de depuração).
  • Isso é um bom ponto @jfpoilpret, não levei em consideração. Você tem alguma ordem de magnitude de eficiência em comparação com uma versão dtostrf + concat? O mesmo se aplica a sscanf ()? (aliás, agora duvido que sscanf () funcione bem no arduino)
  • Não realizei medições reais para comparar as duas chamadas, mas acho que seria possível apenas dar uma olhada no código C e possivelmente verificar a montagem gerada. Em relação ao sscanf, IIRC tem algumas limitações (com números de ponto flutuante, eu acho).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *