Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我改变NEO-6m波特率时,它将失去它';s精度_C++_Arduino_Gps - Fatal编程技术网

C++ 当我改变NEO-6m波特率时,它将失去它';s精度

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.

我有一个真正合法的NEO-6m,可以在9600波特下正常工作。它相当准确,在谷歌地图上显示了我的房子。然而,当我去u-center并将波特率更改为115200时,它的准确性降低了几条街。它从我家到大约30英里外。我用的是neo-6m和Arduio Mega。我正在使用微型GPS库提供的“完整示例”测试代码,对此我没有任何问题。有没有办法改变波特率并保持其准确性

以下是您需要的代码:

#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科普全球定位系统。