C++ 当我改变NEO-6m波特率时,它将失去它';s精度
我有一个真正合法的NEO-6m,可以在9600波特下正常工作。它相当准确,在谷歌地图上显示了我的房子。然而,当我去u-center并将波特率更改为115200时,它的准确性降低了几条街。它从我家到大约30英里外。我用的是neo-6m和Arduio Mega。我正在使用微型GPS库提供的“完整示例”测试代码,对此我没有任何问题。有没有办法改变波特率并保持其准确性 以下是您需要的代码:C++ 当我改变NEO-6m波特率时,它将失去它';s精度,c++,arduino,gps,C++,Arduino,Gps,我有一个真正合法的NEO-6m,可以在9600波特下正常工作。它相当准确,在谷歌地图上显示了我的房子。然而,当我去u-center并将波特率更改为115200时,它的准确性降低了几条街。它从我家到大约30英里外。我用的是neo-6m和Arduio Mega。我正在使用微型GPS库提供的“完整示例”测试代码,对此我没有任何问题。有没有办法改变波特率并保持其准确性 以下是您需要的代码: #include <TinyGPS++.h> #include <SoftwareSerial.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
This sample code demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
It requires the use of SoftwareSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 10, TXPin = 11;
static const uint32_t GPSBaud = 115200;
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
void setup()
{
Serial.begin(115200);
ss.begin(GPSBaud);
Serial.println(F("FullExample.ino"));
Serial.println(F("An extensive example of many interesting TinyGPS++ features"));
Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
Serial.println(F("Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum"));
Serial.println(F(" (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail"));
Serial.println(F("----------------------------------------------------------------------------------------------------------------------------------------"));
}
void loop()
{
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);
printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
printInt(gps.location.age(), gps.location.isValid(), 5);
printDateTime(gps.date, gps.time);
printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.deg()) : "*** ", 6);
unsigned long distanceKmToLondon =
(unsigned long)TinyGPSPlus::distanceBetween(
gps.location.lat(),
gps.location.lng(),
LONDON_LAT,
LONDON_LON) / 1000;
printInt(distanceKmToLondon, gps.location.isValid(), 9);
double courseToLondon =
TinyGPSPlus::courseTo(
gps.location.lat(),
gps.location.lng(),
LONDON_LAT,
LONDON_LON);
printFloat(courseToLondon, gps.location.isValid(), 7, 2);
const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);
printInt(gps.charsProcessed(), true, 6);
printInt(gps.sentencesWithFix(), true, 10);
printInt(gps.failedChecksum(), true, 9);
Serial.println();
smartDelay(1000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
}
// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
static void printFloat(float val, bool valid, int len, int prec)
{
if (!valid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(' ');
}
smartDelay(0);
}
static void printInt(unsigned long val, bool valid, int len)
{
char sz[32] = "*****************";
if (valid)
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ' ';
if (len > 0)
sz[len-1] = ' ';
Serial.print(sz);
smartDelay(0);
}
static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
if (!d.isValid())
{
Serial.print(F("********** "));
}
else
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
Serial.print(sz);
}
if (!t.isValid())
{
Serial.print(F("******** "));
}
else
{
char sz[32];
sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
Serial.print(sz);
}
printInt(d.age(), d.isValid(), 5);
smartDelay(0);
}
static void printStr(const char *str, int len)
{
int slen = strlen(str);
for (int i=0; i<len; ++i)
Serial.print(i<slen ? str[i] : ' ');
smartDelay(0);
}
#包括
#包括
/*
此示例代码演示了TinyGPS++(TinyGPSPlus)对象的正常使用。
它需要使用SoftwareSerial,并假设您有
4800波特串行GPS设备连接在引脚4(rx)和引脚3(tx)上。
*/
静态常数int RXPin=10,TXPin=11;
静态常数32_t GPSBaud=115200;
//TinyGPS++对象
TinyGPSPlus gps;
//与GPS设备的串行连接
软件系列ss(RXPin、TXPin);
无效设置()
{
序列号开始(115200);
开始(GPSBaud);
Serial.println(F(“FullExample.ino”);
println(F(“许多有趣的TinyGPS++特性的广泛示例”);
Serial.print(F(“测试TinyGPS++库v”);Serial.println(TinyGPSPlus::libraryVersion());
序列号:println(F(“米卡尔·哈特”);
Serial.println();
Serial.println(F(“Sats HDOP纬度经度固定日期时间日期Alt航向速度卡距离航向卡字符校验和”);
串行打印LN(F(“(度)(度)年龄(米)---从GPS----到伦敦----RX接收失败”);
Serial.println(F(“----------------------------------------------------------------------------------------------------------------------------------------------------------------”);
}
void循环()
{
静态常数双伦敦纬度=51.508131,伦敦纬度=-0.128002;
printInt(gps.satellites.value(),gps.satellites.isValid(),5);
printFloat(gps.hdop.hdop(),gps.hdop.isValid(),6,1);
printFloat(gps.location.lat(),gps.location.isValid(),11,6);
printFloat(gps.location.lng(),gps.location.isValid(),12,6);
printInt(gps.location.age(),gps.location.isValid(),5);
printDateTime(gps.date,gps.time);
printFloat(gps.altime.meters(),gps.altime.isValid(),7,2);
printFloat(gps.course.deg(),gps.course.isValid(),7,2);
printFloat(gps.speed.kmph(),gps.speed.isValid(),6,2);
printStr(gps.course.isValid()?TinyGPSPlus::cardinal(gps.course.deg()):“***”,6);
无符号长距离Kmtolondon=
(无符号长)TinyGPSPlus::distanceBetween(
gps.location.lat(),
gps.location.lng(),
伦敦,
伦敦(伦敦)/1000;
printInt(距离kmtolondon,gps.location.isValid(),9);
伦敦双程=
TinyGPSPlus::courseTo(
gps.location.lat(),
gps.location.lng(),
伦敦,
伦敦(伦敦);
printFloat(courseToLondon,gps.location.isValid(),7,2);
const char*cardinatetolondon=tinygpslus::cardinal(courseToLondon);
printStr(gps.location.isValid()?CardinatorLondon:***,6);
printInt(gps.charsProcessed(),true,6);
printInt(gps.sentencesWithFix(),true,10);
printInt(gps.failedChecksum(),true,9);
Serial.println();
智能延迟(1000);
如果(毫秒()>5000&&gps.charsProcessed()<10)
Serial.println(F(“未收到GPS数据:检查接线”);
}
//此自定义版本的delay()可确保gps对象
//正在被“喂养”。
静态无效smartDelay(无符号长毫秒)
{
无符号长启动=毫秒();
做
{
while(ss.available())
gps.encode(ss.read());
}而(毫秒()-开始<毫秒);
}
静态无效打印浮点(浮点值、布尔有效、整数长度、整数预计算)
{
如果(!有效)
{
而(长度-->1)
序列号。打印(“*”);
序列号。打印(“”);
}
其他的
{
串行打印(val、prec);
int vi=绝对值((int)val);
int flen=prec+(val<0.0?2:1);//和-
flen+=vi>=1000?4:vi>=100?3:vi>=10?2:1;
对于(int i=flen;i您在引脚10和引脚11上使用软件串行接口有什么特殊原因吗?SS基于UART信号的位碰撞,它在低波特率(如9600)下工作正常,但115200可能超出其限制
您可以尝试将GPS连接到4个硬件串行端口中的一个,例如Serial1(18日发送,19日接收)。这需要对代码进行一些修改:
- 删除
静态常量int RXPin=10,TXPin=11;
和软件串行ss(RXPin,TXPin);
- 在
void setup()
中,将ss.begin(GPSBaud)
更改为Serial1.begin(GPSBaud)
- 在
smartDelay
函数中,将ss.available()
替换为Serial1.available()
和ss.read()
替换为Serial1.read()
所有组件都有公差。您可以尝试校准振荡器,获取新部件以获得更好的振荡器,或者满足于较慢的时钟速率。9600bps的定时公差是您尝试的较高比特率的十二倍。无论如何,这不是软件问题,而是一个问题“理解公差并阅读数据表”问题。“它”和“它”是两个不同的词,有其原因。嗨,什么是Serial1?你是说Serial吗?@ComyarD不,我是说Serial1。Arduino Mega有4个串行端口,看一看,但我不认为Serial1是Arudino上的命令?我知道你可以做Serial.available();我的坏,我不知道它的存在。但我如何使用所有4个串行端口?只有Serial1-Serial3。serial只是所有串行端口的通用工具还是Serial0?serial没有任何数字,可以被认为是Serial0。在Arduino Mega上,它连接到USB端口,而Serial1、Serial2、Serial3可以自由用于其他用途,li科普全球定位系统。