NewSoftSerial

A New Software Serial Library for Arduino

News: NewSoftSerial is in the core!  Starting with Arduino 1.0 (December, 2011), NewSoftSerial has replaced the old SoftwareSerial library as the officially supported software serial library.  This means that if you have 1.0 or later, you should not download this library.  To port your code to 1.0, simply change all NewSoftSerial references to SoftwareSerial.

NewSoftSerial is the latest of three Arduino libraries providing “soft” serial port support. It’s the direct descendant of ladyada’s AFSoftSerial, which introduced interrupt-driven receives — a dramatic improvement over the polling required by the native SoftwareSerial.

Without interrupts, your program’s design is considerably restricted, as it must continually poll the serial port at very short, regular intervals. This makes it nearly impossible, for example, to use SoftwareSerial to receive GPS data and parse it into a usable form. Your program is too busy trying to keep up with NMEA characters as they arrive to actually spend time assembling them into something meaningful. This is where AFSoftSerial’s (and NewSoftSerial‘s) interrupt architecture is a godsend. Using interrupt-driven RX, your program fills its buffer behind the scenes while processing previously received data.

Improvements

NewSoftSerial offers a number of improvements over SoftwareSerial:

  1. It inherits from built-in class Print, eliminating some 4-600 bytes of duplicate code
  2. It implements circular buffering scheme to make RX processing more efficient
  3. It extends support to all Arduino pins 0-19 (0-21 on Arduino Mini), not just 0-13
  4. It supports multiple simultaneous soft serial devices.*
  5. It supports a much wider range of baud rates.**
  6. It provides a boolean overflow() method to detect buffer overflow.
  7. Higher baud rates have been tuned for better accuracy.
  8. It supports the ATMega328 and 168.
  9. It supports 8MHz processors.
  10. It uses direct port I/O for faster and more precise operation.
  11. (New with version 10).  It supports software signal inversion.
  12. (New) It supports 20MHz processors.
  13. (New) It runs on the Teensy and Teensy++.
  14. (New) It supports an end() method as a complement to begin().

*But see below for an important caveat on multiple instances.
**Be circumspect about using 300 and 1200 baud though. The interrupt handler at these rate becomes so lengthy that timer tick interrupts can be starved, causing millis() to stop working during receives.

Using Multiple Instances

There has been considerable support for an library that would allow multiple soft serial devices. However, handling asynchronously received data from two, three, or four or more serial devices turns out to be an extremely difficult, if not intractable problem. Imagine four serial devices connected to an Arduino, each transmitting at 38,400 baud. As bits arrive, Arduino’s poor little processor must sample and process each of 4 incoming bits within 26 microseconds or else lose them forever. Yikes!

It occurred to me, though, that multiple instances could still be possible if the library user were willing to make a small concession. NewSoftSerial is written on the principle that you can have as many devices connected as resource constraints allow, as long as you only use one of them at a time. If you can organize your program code around this constraint, then NewSoftSerial may work for you.

What does this mean, exactly? Well, you have to use your serial devices serially, like this:

#include <NewSoftSerial.h>

// Here's a GPS device connect to pins 3 and 4
NewSoftSerial gps(4,3);

// A serial thermometer connected to 5 and 6
NewSoftSerial therm(6,5);

// An LCD connected to 7 and 8
NewSoftSerial LCD(8,7); // serial LCD

void loop()
{
  ...
  // collect data from the GPS unit for a few seconds
  gps.listen();
  read_gps_data();  // use gps as active device
  // collect temperature data from thermometer
  therm.listen();
  read_thermometer_data(); // now use therm
  // LCD becomes the active device here
  LCD.listen();
  LCD.print("Data gathered...");
  ...
}

In this example, we assume that read_gps_data() uses the gps object and read_thermometer_data() uses the therm object. Any time you call the listen() method, it becomes the “active” object, and the previously active object is deactivated and its RX buffer discarded. An important point here is that object.available() always returns 0 unless object is already active. This means that you can’t write code like this:

void loop()
{
  device1.listen();
  if (device1.available() > 0)
  {
    int c = device1.read();
    ...
  }
  device2.listen();
  if (device2.available() > 0)
  {
    int c = device2.read();
    ...
  }
}

This code will never do anything but activate one device after the other.

Signal Inversion

“Normal” TTL serial signaling defines a start bit as a transition from “high” to “low” logic.  Logical 1 is “high”, 0 is “low”.  But some serial devices turn this logic upside down, using what we call “inverted signaling”.  As of version 10, NewSoftSerial supports these devices natively with a third parameter in the constructor.

NewSoftSerial myInvertedConn(7, 5, true); // this device uses inverted signaling
NewSoftSerial myGPS(3, 2); // this one doesn't

Library Version

You can retrieve the version of the NewSoftSerial library by calling the static member library_version().

int ver = NewSoftSerial::library_version();

Resource Consumption

Linking the NewSoftSerial library to your application adds approximately 2000 bytes to its size.

Download

The latest version of NewSoftSerial is available here: NewSoftSerial12.zip.  Note: don’t download this if you have Arduino 1.0 or later.  As of 1.0, NewSoftSerial is included in the Arduino core (named SoftwareSerial).

Change Log

  1. initial version
  2. ported to Arduino 0013, included example sketch in package
  3. several important improvements: (a) support for 300, 1200, 14400, and 28800 baud (see caveats), (b) added bool overflow() method to test whether an RX buffer overflow has occurred, and (c) tuned RX and TX for greater accuracy at high baud rates 38.4K, 57.6K, and 115.2K.
  4. minor bug fixes — add .o file and objdump.txt to zip file for diagnostics.
  5. etracer’s inline assembler fix to OSX avr-gcc 4.3.0 interrupt handler bug added.
  6. ladyada’s new example sketch, fix to interrupt name, support for 328p.
  7. etracer’s workaround is now conditionally compiled only when avr-gcc’s version is less than 4.3.2.
  8. 8 MHz support and flush() and enable_timer0()  methods added
  9. digitalread/write scrapped in favor of direct port I/O.  Revised routines now get perfect RX up to 57.6K on 16MHz processors and 31.25K on 8MHz processors.
  10. inverted TTL signalling supported.  20MHz processors supported.  Teensy and Teensy++ supported.  New end() method and destructor added to clean up.
  11. added listen() method to explicitly activate ports.
  12. warn users about 1.0 conflict

Acknowledgements

Many thanks to David Mellis, who wrote the original SoftwareSerial, and to the multi-talented ladyada, whose work with AFSoftSerial is seminal.  Ladyada also provided the “Goodnight, moon” example sketch, fixed a problem with the interrupt naming (see v6) and tested NSS with the 328p.

Thanks also to rogermm and several other forum users who have tested NewSoftSerial and given useful feedback.

The diligent analysis of forum user etracer yielded the root cause of a tricky problem with NSS on OSX.  A bug in avr-gcc 4.3.0 causes the compiler to fail to generate the proper entry and exit sequences for certain interrupt handlers.  etracer identified the problem and provided an inline workaround.  etracer’s fix is in NSS 5.

User jin contributed a large body of work based on NSS and identified a potential problem that could result in data loss (fixed in NSS 5).  jin also made a variant of NSS that supports 4-pin serial, with the additional pins providing a very nice RTS/CTS flow control.  We may see this in NSS in the near future.

Thanks to Garret Mace, who contributed the delay tables for 20MHz processors and claims that he can send and receive at 115K baud.  Cool!

Thanks to Paul Stoffregen, both for his fine work with Teensy and Teensy++, and for contributing some useful suggestions that help NewSoftSerial run on them without modification.

I appreciate any and all input.

Mikal Hart

Page last updated on July 3, 2013 at 7:37 pm
647 Responses → “NewSoftSerial”

  1. David W

    12 years ago

    Mikal- First Thanks for all your help that you have freely given.

    I just want to give feed back to your suggestion about looking at what SoftwareSerial is feeding out to TinyGPS. I stripped out SoftwareSerial out of the example that came with TinyGPS and read directly from Pin 0 from the Arduino Uno. The results were telling and your correct TinyGPS works like a charm. For some strange reason SoftwareSerial strips out all RMC messages. What’s weird is out of all the six possible NMEA messages, The only two that get passed are GGA and GLL. From what I am seeing is you get a GLL messages to every GGA messages- (And no I have not change the factory settings on my GPS- as reflective of the raw data that I sent from the LS23001 to the Arduino IDE’s monitor). As you know that’s not right because there is a sequence that every GPS goes through which means you get one of each message every time you pass through the cycle. On top of that; as you already know without a RMC message you can’t get the date. And TinyGPS only uses the two messages (GGA and RMC) to do it’s magic. If I had 500 dice and I through them up in the air and looked at what numbers showed up when they came down. I should at least come up with every number between 1 and 7. Yes, I might come up with more number X then the others, but I should come up with at least one representative of the 1 through 7 faces of the dice. That’s not happening with SoftwareSerial. 500+/- NMEA messages and not one RMC message shown up in 235 times of running TinyGPS with the modified code you suggested. Not even a part of the message. Not a part of GSA, GSV or VTG showing up either. I am only getting two messages and they are the GLL and GGA. Something is “throwing” the dice off.


  2. Mikal

    12 years ago

    David,

    Thank you for your detailed feedback. I’m going to postulate that you are experiencing a buffer overflow condition. It’s easy to prove. Just print out the value of the software serial “overflow” member:

    Serial.print("Overflow is ");
    Serial.println(ss.overflow());
    

    Here’s what I guess is happening. Your GPS unit sends 6 sentences every second (or worse, every 200 milliseconds). These 6 are always bunched together and the first two are the GLL and GGA sentences. As they arrive you begin processing them and start getting slow about removing the incoming data from the 64-byte SoftwareSerial buffer. The buffer overflows and the remaining 4 sentence are either truncated or lost altogether. TinyGPS discards any partial sentence it finds.

    Now your program gets caught up so that by the time the next batch of 6 sentences arrive one second later, it is ready for them. But again, only the first two sentences are actually processed.

    Make sense?


  3. Aakash

    12 years ago

    will you plz guide me were i can get this library download?


  4. Andrea

    12 years ago

    Hi! I need help, i have an error about this library, well in fact the library i have is softwareserial, but there´s an error of the pins or something like that with 12 and 13
    Have somebody had this error and could help me please?


  5. Sebastian

    12 years ago

    Hi,
    is it possible to tweak the SoftwareSerial library in a way such that higher baudrates (such as 460800) are supported? I would appreciate this very much.
    Thank you for this very nice library.
    Sebastian


  6. Mikal

    12 years ago

    @Sebastian,

    Unfortunately, no. The AVR processors just aren’t powerful enough to process data at that rate. Even 115K and 57K are not very reliable.


  7. Nimit

    12 years ago

    Hi Mikal,

    Would you please be so kind to help me on this Newsoftserial, I have to pause this Softserial and restart again after I do some interupt because the Newsoftserial keep disable interupt.

    Can I used End(); and Begin(); or anything else better for thst?

    Thank

    NM


  8. PRAKASH W DANDEKAR

    12 years ago

    Hello,

    I am using ATmega644 or ATmega1284 as Sanguino. An improvement to old Arduino versions (up to 22) have been done by two persons Zac Hoeken for 644 and R K Sharma for 1284.

    Can I add your soft serial library to those Arduino 21 or 22 version or is it good for ATmega328?

    Regards,

    -P W Dandekar


  9. pescadito

    12 years ago

    hi
    i tried to run SoftwareSerialExample over a AtTiny85 bootburned with arduino, but i only get gabarish characters when read o write.
    I use pb2 for rx and pb3 for tx. i tried 1, 8 and 20 mhz, at 9600 to 2400 bps without succeful.
    i see a lot of discussion over different forums but no easy end solution appears. Someones talk about hand tunning the clock processor.

    Do you have any tip to allow AtTiny85 support SoftwareSerial?
    Best regards Pescadito.


  10. Mikal

    12 years ago

    @Nimit,

    It should be ok to simply end() and then begin() again. That’s what I designed end() for. Let us know if it works…!


  11. Mikal

    12 years ago

    @Prakash,

    I think NSS should work fine with Sanguino–as long as you have the correct timings. It’s not just limited to the ATmega328.


  12. Mikal

    12 years ago

    Does the ATTiny85 even support pin change interrupts?

    What is the processor clock speed on that device?


  13. Faheem

    12 years ago

    Hi,
    i am using atmega 328 to communicate with my mongose imu which also have atmega 328 controller. i am reading data from sensor using Software Serial and then printing these data using hardware serial pin on UNO board. It print or transmit data correctly for some time means for just 5 or 10 seconds after that it transmit constant form of data………i need your help


  14. Marc

    12 years ago

    Hey.
    I’m working with an Arduino Uno on which i’m trying to hook up two RFID readers (Parallax readers running at 2400 bps). (I’m running Arduino 1.0)
    I can get i to work fine with 1 RFID reader, but when hooking the other one up, it won’t read anything. I pasted my code on pastie.org here:
    http://pastie.org/3890243
    (Sorry for the danish comments a few places)
    It’s meant to act like this:
    Reader1 reads the tag and lights a LED and if reader2 reads the tag and lights another LED and turns the other one off.
    CHeers for any help. :)
    /Marc


  15. Mikal

    12 years ago

    @Faheem,

    It’s hard to guess. Can we see your code?


  16. Mikal

    12 years ago

    @Marc,

    Read carefully the section on “Using Multiple Instances”. Your code is almost a textbook example for what not to do with multiple ports. For your application I think you’d roughly want to do something like:

    void loop()
    {
      port1.listen();
      // wait for several seconds or until you get a valid code on port 1
      ...
      port2.listen();
      // wait for several seconds or until you get a valid code on port 2
      //
    }
    

  17. Marc

    12 years ago

    @ Mikal
    Well, i feel a tad stupid now. >.<
    You said, "wait some time", so i added a delay(250); after my listen(); calls and that fixed it. :)
    Thank you for the help mate. ;)


  18. Larry Walker

    12 years ago

    Mikal:

    I am trying to use the NewSoftSerial library (freshly downloaded today) under Arduino v21 with the SD library to talk to a LadyAda Data Logger shield (http://www.ladyada.net/make/logshield/).

    I’ve incorporated the LadaAda sample code into my project and can log data to the SD card just fine. My design needs to use an RS232 connection on D0/D1 as a connection to a maintenance/control panel (talks to a PC terminal emulator in practice or to the Arduino serial monitor in testing) but I also need to drive a Sparkfun Serial 4×20 LCD. So I’m trying to run NewSoftSerial on D2/D3 to drive the LCD. That also works fine in a small test case (i.e. it co-exists with the standard Serial reads/writes to the D0/D1 console).

    But when I combine it all into my project, the first call to SD.exists() blows up and throws me back into executing the setup() routine again, as if a reset had occurred.

    I can reproducibly turn this failure mode on/off merely by uncommenting/commenting the line:

    #include

    (This is with all calls to NSS functions commented out, to suppress compiler errors when the #include is commented out…)

    Can you suggest what the conflict between the NSS and SD libraries might be, and/or recommend a work-around?

    Oddly, the SD.begin() call in my setup() routine does NOT fail, only the subsequent SD.exists() call. Not sure if that’s a helpful clue or not…

    Thanks in advance for any suggestions you can offer,

    Larry


  19. Larry Walker

    12 years ago

    oops:

    the #include that toggles my problem on/off should have had “NewSoftSerial.h” (minus the quotes) in a less-than/greater-than pair, but I think they got eaten when I submitted my question…

    retest of include line, just for reference:

    #include

    Larry


  20. Larry Walker

    12 years ago

    : my apparent problem with Sd vs NSS is resolved: operator error. This is the my first Arduino project that has hit the limit on RAM. And since the Arduino IDE does not give any feedback on RAM usage, the timing and symptoms of RAM overflow are messy and bizarre. Took me quite a while to hip to what was going wrong.

    As far as I can tell, just #including NewSoftSerial.h must ad just enough RAM usage to trigger overflow.

    I finally thought to try to reproduce what I was seeing (commenting/uncommenting the #include to toggle the failure mode on/off) by adding the #include to the CardInfo sketch that goes with the SD shield: no effect…

    Time to look at a Mega, I guess!

    Sorry for the false alarm

    Larry


  21. Baz

    12 years ago

    I tried to figure out yesterday some strange behaviour in my simple code that was reading bytes at 600 Bauds.
    After a while, i discovered that there is now row for 600 bauds in delay tables.
    It was hard to figure out because no error code is thrown when bad baudrate is selected. What is strange however is that i was really able to read bytes at 600 bauds by switching off the “available” test that was always returning 0.

    I tried to mimic the other rows to add a 600 baud line, and it seems to work fine now.
    However, there is no comment in the code about how the different delays have been chosen (on the same line, there are some small difference (+- 3).

    I think it should be cool to have 600 baud support in the future, since it is not a seldom baudrate, and to have also a feedback on “begin” when the baudrate is not supported.

    Baz


  22. Mikal

    12 years ago

    Thanks for the follow up, Larry. Yeah, those low RAM scenarios are devilishly hard to debug!


  23. Scott

    12 years ago

    SoftwareSerial is not compiling for the Leonardo. I am told it is because there are some details still missing for implementing the interrupts needed. I use software serial quite a bit and would really appreciate it if it would run on the Leonardo!

    Any ideas?


  24. Bernd

    12 years ago

    Hi!
    Is it possible to use it with an AtMega8 and Arduino?ä

    Yours

    Alexander


  25. Mikal

    12 years ago

    @Bernd,

    I don’t think the AtMega8 supports pin change interrupts, so no, I don’t think NewSoftSerial will work.


  26. Tiago Custódio

    12 years ago

    Hi, i’m looking forward to use SoftwareSerial in an attiny85 running at 16.5Mhz, but i can’t figure how to calculate the delay table that should be used. Any heads up?


  27. toni

    12 years ago

    i want ask something mr and mrs.

    i got some troubles yesterday, when i want send message using arduino with wavecom 1206b for gsm communicating.
    when i use rx and tx normally by using arduino, its rx and tx original, my code can work i can send message and recieve and read message. but when i implement it with the other serial that using pin 2 and 3, or rx and tx from newsoftserial. it can’t work suddenly. when i change to use rx and tx original in arduino again it can work again.
    can you help me ?
    is there different thing in serial that provide by arduino and newsoftserial ?


  28. Mikal

    12 years ago

    @Tiago,

    If it’s really 16.5MHz, for a start I would take each value in the 16 MHz table and multiply by (16.5 / 16) or about 1.03125. In other words, you’d be increasing the number of delay cycles by 3% to compensate for the fact that the processor is running about 3% faster.

    This won’t be perfect, but it will probably be close enough at the slower baud rates.

    Mikal


  29. Mikal

    12 years ago

    @toni,

    Software serial uses a completely different technology than HardwareSerial, but the end results should be the same. Is it possible that you have the RX and TX pins reversed?


  30. Jessi

    12 years ago

    @Toni,

    I’m having the same problem on Arduinop Mega. Serial works great, but 1, 2, and 3 won’t work at all. I’ve checked the rx/tx connections.
    I simplified the code to the basic “Hello World” and nothing happens. It runs fin when I use the original pins though.

    void setup()
    {
    Serial1.begin(9600);
    Serial1.println(“Hello World!”);
    }

    void loop()
    {
    }

    Thoughts?


  31. Thomas

    12 years ago

    This is good information but where do I download NewSoftSerial?


  32. UnaClocer

    12 years ago

    I need to run at 7815bps (could get away with a little higher/lower on this one), and 12500bps. Will the software serial library be capable of that?


  33. Mikal

    12 years ago

    @Thomas,

    It’s down near the bottom of the page.


  34. Mikal

    12 years ago

    @UnaClocer,

    I’m afraid the library doesn’t support those bit rates, though it would mean only adding a line to the baud table to do it. You’d have to calculate that, though.


  35. Bodhi

    12 years ago

    Hi all,
    i need to work with a frequency of aprox. 960baud and a F_CPU=16Mhz. In the library this freq. is not used and i’ve not been able to find on the web what is rxcenter //rxintra//rxstop//tx need for 960baud. Could you please help me to add these parameters and then modify the lib.
    Thanks in advance,


  36. sleepy

    12 years ago

    hi ,

    I’m testing the hello world exaple on may adruino uno. but the code prints out only goodnight moon. I also don’t see tx or rx led flashing. can you help getting this to work?

    #include

    SoftwareSerial mySerial(2, 3);

    void setup()
    {
    Serial.begin(57600);
    Serial.println(“Goodnight moon!”);

    // set the data rate for the SoftwareSerial port
    mySerial.begin(4800);
    mySerial.println(“Hello, world?”);
    }

    void loop() // run over and over
    {
    if (mySerial.available())
    Serial.print((char)mySerial.read());
    if (Serial.available())
    mySerial.print((char)Serial.read());
    }


  37. Andrew Symington

    12 years ago

    Hi Mikal

    I notice that both the recv and write functions are blocking, because of the delay function. Is there a specific reason that you didn’t use CTC timers and a state-based approach to sending and receiving? For example, if you set the clock prescaler to 8 on an 8MHz AVR, you’d effectively have a 1us internal tick. You can then set the HW compartor on the clock to fire an interrupt after a given number of microseconds. A state-based architecture could maintain the current start / data / stop bit of the message that is being received or transmitted. I’ve implemented this approach, and I seem to get some characters at 9660 baud, while the others are garbled. I’m not sure if this has to do with an inherent design flaw (clock jitter) or bad delay values. Any input would be appreciated.

    Andrew


  38. Bob

    12 years ago

    Hi, firstly, what a great implementation of a softserial this is, but I have a little problem.. I need to be able to switch OFF the softserial interrupt when I am not using it (thats like most of the time)

    I put the “SoftwareSerial mySerial(x,y)” before my init code just to set up the pins I want to use, then I want to inhibit it until I need it

    I really cant run this alongside my DMX code as the two seem to dislike each other very much, and it seems to do some very strange things with my millis() and MsTimer2 code.. if I remove the softserial alltogether it all works just fine, but I really would like to use the softserial too

    Please help, thanks


  39. Mikal

    12 years ago

    @Bodhi,

    I would simple add an extra line to the delays table that supports 960 baud. Just copy the line for 9600 baud and multiply all the delay values by 10. It won’t be exact, but I bet it will work.


  40. Mikal

    12 years ago

    @sleepy,

    You’ll only see “Hello, world?” if you have connected a serial display device to pins 2 and 3. And you won’t see the TX/RX leds flashing, because they only “listen” to the real serial port on pins 0/1.


  41. Mikal

    12 years ago

    @Andrew Symington,

    I replied via email.


  42. Mikal

    12 years ago

    @Bob,

    The SoftwareSerial object doesn’t allocate the interrupt until you call .begin(…). You can wait until you need the interrupt and only then call begin. Also, you can call end() to quit using the interrupt at any time.


  43. Åge Ågesen

    12 years ago

    I’m having serious issues with SoftwareSerial included in the MacOS version of Arduino 1.0.1. I’ve explained the problem her: http://electronics.stackexchange.com/questions/40408/making-an-echo-sketch-using-softwareserial-and-bluetooth. I would appreciate any help regarding this problem.


  44. Harald

    12 years ago

    Hi Mikal,
    I don’t know if I use your library in the wrong way but when I uncomment the line Serial.begin(9600) I will not get any outputs from mySerial (listening on RX and TX for incoming data from a XBee) any more.
    Isn’t there a way to mix both serials: SoftwareSerial and the ‘normal’ Serial ?
    I want output on the monitor which doe not come from mySerial.
    Thanks for your help.
    Regards
    Harald

    #include

    SoftwareSerial mySerial(2,3);

    void setup()
    {
    //Serial.begin(9600); //if I uncomment this line I will not get
    // any output from mySerial
    mySerial.begin(9600);
    }

    void loop()
    {
    if(mySerial.available())
    {
    char c = mySerial.read();
    mySerial.println(c);
    }
    Serial.println(“Hallo”);

    delay(2000);
    }

6 Trackbacks For This Post
  1. I can solder! 7-Segment Serial Display & Nunchucky operational « I Am Chris Nolan.ca

    […] already.  I found this wall of text which I managed to digest down into this gist (and updated it thanks to these notes) which you can see running in the above […]

  2. S2 » Android + Bluetooth + Arduino

    […] そして、シリアル通信のテストに利用したArduinoのソースです。 NewSoftSerial(Arduinoライブラリ)を利用しています。 […]

  3. Getting started with DroneCell and Arduino.

    […] DroneCell and the GPS simultaneously. I stumbled upon this interesting behavior in NewSoftSerial. NewSoftSerial*|*Arduiniana. I seem to at least have something to go on… Using Multiple Instances There has been […]

  4. Emular pines Serial de Arduino con la librería NewSoftSerial » Blog Archive » el blog de giltesa

    […] eso es lo que es capaz de hacer la librería NewSoftSerial (más documentación aquí). Usándola podremos emplear el resto de pines como puertos serial, ya […]

  5. Time - He's waiting in the wings - Cuyahoga

    […] in the download is TimeGPS.pde, but it’s a touch outdated now that Mikal Hart’s NewSoftSerial library has been rolled up into the core (since 1.0) and renamed SoftwareSerial. The problem I had […]

  6. Arduino的通讯扩展板介绍 | 爱板网

    […] GPS模块与Arduino的通讯程序 […]

Leave a Reply