Arduino和TinyGPS ++将lat和long转换为字符串

时间:2015-11-29 12:19:07

标签: string arduino

我在解决TinyGPS ++中的lat和long Cords到Double或者字符串时遇到问题。我正在使用的代码是:

String latt = ((gps.location.lat(),6));
String lngg = ((gps.location.lng(),6));

Serial.println(latt);
Serial.println(lngg);

我得到的输出是:

  

0.06

有人知道我做错了什么吗?它与舍入有关吗? Arduino中的(Math.Round)函数。

谢谢!

1 个答案:

答案 0 :(得分:1)

有两个问题:

1。这不编译:

String latt = ((gps.location.lat(),6));

我得到的错误是

Wouter.ino:4: warning: left-hand operand of comma has no effect
Wouter:4: error: invalid conversion from 'int' to 'const char*'
Wouter:4: error: initializing argument 1 of 'String::String(const char*)'

String类的定义中没有任何内容允许此语句。我无法重现0.06(在您的问题中)或0.006(在稍后的评论中)的打印值。请编辑您的帖子以获得编译,运行和打印这些值的确切代码。

2。您无意中使用了逗号运算符。

有两个地方可以使用逗号:将参数与函数调用分开,并分隔多个表达式,这些表达式计算到最后一个表达式。

你不是在这里调用一个函数,所以它是后者使用的。那是什么意思?这是一个例子:

int x = (1+y, 2*y, 3+(int)sin(y), 4);

变量x将被赋予 last 表达式4的值。实际上,没有人会以这种方式实际使用逗号运算符。写作更容易理解:

int x;
1+y;              // Just a calculation, result never used
2*y;              // Just a calculation, result never used
3 + (int) sin(y); // Just a calculation, result never used
x = 4;            // A (trivial) calculation, result stored in 'x'

编译器通常会优化前3个语句,并仅生成最后一个 1 的代码。我经常在#define宏中看到试图避免多个语句的逗号运算符。

对于您的代码,编译器会看到这个

((gps.location.lat(),6))

并将其评估为对gps.location.lat()的调用,该调用返回double值。编译器抛弃了这个值,甚至警告你它“没有效果。”

接下来,它会看到6,这是此表达式的实际值。括号将弹出,将6值分配给语句的左侧String latt =

如果您查看String的声明,则不会定义如何使用6之类的int并构建新的String,或者为其分配6 。编译器看到String 可以<{1}}构建,因此它会告诉您它无法将数字const char *转换为6

与编译器不同,我想我能理解你的意图:

const char *

double latt = gps.location.lat(); double lngg = gps.location.lon(); Serial.println( latt, 6 ); Serial.println( lngg, 6 ); 旨在作为6的参数。这些参数用逗号正确分隔。

作为进一步的奖励,它不使用Serial.println类,这无疑会引起后来的麻烦。真的,不要使用String。相反,请保留数字值,例如Stringint s,并在最后一刻将其转换为文本(例如,使用float)。

我经常希望编译器可以完成我的意思,而不是我所说的。 :d

<小时/> 1 根据println类型,评估表达式y可能会产生无法优化的副作用。流式算子2*y是数学运算符(左移)的一个很好的例子,其副作用无法优化。

在您的代码中,调用<<可能修改了gps.location.lat()gps类内部的内容,因此编译器可能没有优化函数调用。

在所有情况下,都不会分配调用的结果,因为只有最后一个表达式值(6)用于赋值。