Go Down

Topic: Serial type conflicts in arduino 1.0 (Read 1 time) previous topic - next topic

dweston

I have another newbie compile error I don't seem to be able to resolve myself.

It arises with use of a couple of Mikal Hart's TinyGPS and NewSoftSerial packages.

His NewSoftSerial v11 package has morphed to become "SoftwareSerial" with indication on his site that his NewSoftSerial package is to be incorporated native into the Arduino 1.0 IDE itself; which could be the root of the compile conflict I'm encountering. See dot point 5 of the change list for this beta version at:
<http://arduiniana.org/2011/01/newsoftserial-11-beta/>

I'm using arduino 1.0 and am attempting to use the TinyGPS v10 package accessible here:
<http://arduiniana.org/libraries/tinygps/>

The example code I'm trying to compile is:
Code: [Select]
#include <NewSoftSerial.h>
#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of NewSoftSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
*/

TinyGPS gps;
NewSoftSerial nss(2, 3);

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

void setup()
{
  Serial.begin(115200);
  nss.begin(4800);
 
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();

  // Every 5 seconds we print an update
  while (millis() - start < 5000)
  {
    if (feedgps())
      newdata = true;
  }
 
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
 
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print(".");

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
 
  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): "); Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second)); Serial.print("."); Serial.print(static_cast<int>(hundredths));
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");
 
  feedgps();

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): "); Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): "); printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");  printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): "); printFloat(gps.f_speed_kmph()); Serial.println();

  feedgps();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: "); Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}
 
bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}


Obviously the top line <#include <NewSoftSerial.h>> reference needs to be updated to <#include <SoftwareSerial.h>> but I still get the following compile error.

In file included from test_with_gps_device.cpp:1:
...../arduino-1.0/libraries/SoftwareSerial/SoftwareSerial.h:95: error: conflicting return type specified for 'virtual void SoftwareSerial::write(uint8_t)'
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'

Given my lack of Arduino knowledge so far I'm presuming the return conflict referred to is a consequence of the SoftwareSerial.h duplicating native arduino 1.0 code. But if so could someone point out me how to reference inclusion of the native serial library such that I can discard the SoftwareSerial include?

PaulS

Quote
Obviously the top line <#include <NewSoftSerial.h>> reference needs to be updated to <#include <SoftwareSerial.h>> but I still get the following compile error.

So why don't you make that change? If you did, then the code you posted is NOT the code you are trying to compile.

It does not appear as though the TinyGPS library has been upgraded to 1.0, yet.

Quote
Given my lack of Arduino knowledge so far I'm presuming the return conflict referred to is a consequence of the SoftwareSerial.h duplicating native arduino 1.0 code. But if so could someone point out me how to reference inclusion of the native serial library such that I can discard the SoftwareSerial include?

The native serial library is for hardware serial ports. You can connect your GPS to the hardware serial port, and change all occurrences of nss to Serial. But, then you won't be able to debug anything.

dweston

Appreciate your response PaulS.

I did make those changes and the errors I posted arose from attempting to compile the modified code. I included the original code in order to ensure the 'clean' code was presented for those of you on the forum who may have needed to see the context I started from.

Yep you are right that TinyGPS looks like being in need of refinement for the new IDE.

I understand the purpose of using the NewSoftSerial is to improve reliability and flexibility of Arduino serial coms.

Looks like I may have to wait awhile for an update or load one of the old IDE versions and try that route.

Cheers.

magnethead794


Appreciate your response PaulS.

I did make those changes and the errors I posted arose from attempting to compile the modified code. I included the original code in order to ensure the 'clean' code was presented for those of you on the forum who may have needed to see the context I started from.

Yep you are right that TinyGPS looks like being in need of refinement for the new IDE.

I understand the purpose of using the NewSoftSerial is to improve reliability and flexibility of Arduino serial coms.

Looks like I may have to wait awhile for an update or load one of the old IDE versions and try that route.

Cheers.


There are a number of us still on 002x IDE
KF5RVR

winner10920

Im not sure but I think you may be able to fix it yourself, look at the changes in the new ide and try and repair  errors, it could be as simple as removing the uint_8 and putting in size_t, im not sure tho but maybe its worth a shot

dweston

I have found a simple solution to the problem.

Remove the SoftwareSerial folder from the arduino 1.0 libraries folder.

Obviously the two instances of SoftwareSerial.h (one in the user library and the other native) was the cause of the compile error.

PaulS

Quote
I have found a simple solution to the problem.

Remove the SoftwareSerial folder from the arduino 1.0 libraries folder.

Obviously the two instances of SoftwareSerial.h (one in the user library and the other native) was the cause of the compile error.

So, you want to keep the one that comes from who knows where, that may or may not be any good, and delete the one that is known to work and is supported. OK, whatever works for you.

shirshak sengupta

hey! i am using arduino 0023, sparkfun gps shield and mediatek 3329 gps module. i have tried tiny gps and newsoftserial libraries but nothing works.
my output is gibberish.
any clue why its is so?

dxw00d

Have you read this? http://arduino.cc/forum/index.php/topic,97455.0.html

In particular, point 6.

Go Up