arduinoの初心者私はかなりn00bの問題のように聞こえるものに苦労しています…私は配線しましたadafruit GPSボードをArduinoに接続すると、GPSデータがSerial.print(GPS.latitude, DEC)
文字列を連結したいのでシリアルポートに吐き出されます。これを処理できます(読み取り:イーサネットクライアント経由で送信したい)これはすでに取得したものです:
...... 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);
エラーメッセージは次のとおりです:Call of overloaded "concat(float&)" is ambiguous
Serial.print(GPS.latitude, DEC)
とすると、次のようになります。4418.5937996050
おそらく大きすぎるか何かです…
変数を連結して長い文字列を作成するにはどうすればよいですか?
コメント
回答
concat関数はfloatバージョンを実装していませんが、いくつかof char、int、unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
したがって、コンパイラは整数にキャストする(おそらくfloatを切り捨てる)方法を知りません。オプション。
最初にfloatを文字列に変換し、dtostrf()またはsprintf()を使用してから、文字列に連結する必要があります。
char outstr[25]; sprintf(outstr, "%f", GPS.latitude);
または
dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs
次に:
vnnt.concat(outstr)
また、sprintfは非常に便利です。 (char)文字列のコンパクトな作成:
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
コメント
- + 1疑わしい場合は、
sprintf
それを出します:) - ただし、注意点が1つあります:
sprintf()
は複雑な関数であるため、むしろ遅く、かなりのメモリを使用します。通常、"本番"コードでは回避します(デバッグ目的でのみ保持します)。 - つまり良い点@jfpoilpret、私は考慮しませんでした。 dtostrf + concatバージョンと比較して、ある程度の効率はありますか?同じことがsscanf()にも当てはまりますか? (ところで、sscanf()が実際にarduinoで正常に機能するかどうかは疑問です)
- 両方の呼び出しを比較するために実際の測定を実行しませんでしたが、Cコードを見て、おそらくチェックすることができると思います生成されたアセンブリ。
sscanf
に関して、IIRCにはいくつかの制限があります(浮動小数点数があると思います)。
vnnt
と言い、もう1つはvannut
GPS.latitude
のデータ型を知っていますか?例えば。float
、int
などですか?