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
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).
vnnt
enquanto outro dizvannut
GPS.latitude
? Por exemplo. é umfloat
,int
, etc.?