aboutsummaryrefslogtreecommitdiff
path: root/libraries/SoftwareSerial
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/SoftwareSerial')
-rwxr-xr-xlibraries/SoftwareSerial/SoftwareSerial.cpp11
-rwxr-xr-xlibraries/SoftwareSerial/SoftwareSerial.h4
-rwxr-xr-xlibraries/SoftwareSerial/examples/TwoPortRXExample/TwoPortRXExample.pde50
-rw-r--r--libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino78
-rwxr-xr-xlibraries/SoftwareSerial/icrmacros.h69
5 files changed, 88 insertions, 124 deletions
diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp
index b8a1fc4..c15bdda 100755
--- a/libraries/SoftwareSerial/SoftwareSerial.cpp
+++ b/libraries/SoftwareSerial/SoftwareSerial.cpp
@@ -42,7 +42,6 @@ http://arduiniana.org.
#include <avr/pgmspace.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
-#include "icrmacros.h"
//
// Lookup table
//
@@ -441,10 +440,12 @@ int SoftwareSerial::available()
return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF;
}
-void SoftwareSerial::write(uint8_t b)
+size_t SoftwareSerial::write(uint8_t b)
{
- if (_tx_delay == 0)
- return;
+ if (_tx_delay == 0) {
+ setWriteError();
+ return 0;
+ }
uint8_t oldSREG = SREG;
cli(); // turn off interrupts for a clean txmit
@@ -485,6 +486,8 @@ void SoftwareSerial::write(uint8_t b)
SREG = oldSREG; // turn interrupts back on
tunedDelay(_tx_delay);
+
+ return 1;
}
void SoftwareSerial::flush()
diff --git a/libraries/SoftwareSerial/SoftwareSerial.h b/libraries/SoftwareSerial/SoftwareSerial.h
index 2fc998c..a6a60b5 100755
--- a/libraries/SoftwareSerial/SoftwareSerial.h
+++ b/libraries/SoftwareSerial/SoftwareSerial.h
@@ -89,10 +89,12 @@ public:
bool overflow() { bool ret = _buffer_overflow; _buffer_overflow = false; return ret; }
int peek();
- virtual void write(uint8_t byte);
+ virtual size_t write(uint8_t byte);
virtual int read();
virtual int available();
virtual void flush();
+
+ using Print::write;
// public only for easy access by interrupt handlers
static inline void handle_interrupt();
diff --git a/libraries/SoftwareSerial/examples/TwoPortRXExample/TwoPortRXExample.pde b/libraries/SoftwareSerial/examples/TwoPortRXExample/TwoPortRXExample.pde
deleted file mode 100755
index 1db4536..0000000
--- a/libraries/SoftwareSerial/examples/TwoPortRXExample/TwoPortRXExample.pde
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <SoftwareSerial.h>
-
-SoftwareSerial ss(2, 3);
-SoftwareSerial ss2(4, 5);
-
-/* This sample shows how to correctly process received data
- on two different "soft" serial ports. Here we listen on
- the first port (ss) until we receive a '?' character. Then
- we begin listening on the other soft port.
-*/
-
-void setup()
-{
- // Start the HW serial port
- Serial.begin(57600);
-
- // Start each soft serial port
- ss.begin(4800);
- ss2.begin(4800);
-
- // By default, the most recently "begun" port is listening.
- // We want to listen on ss, so let's explicitly select it.
- ss.listen();
-
- // Simply wait for a ? character to come down the pipe
- Serial.println("Data from the first port: ");
- char c = 0;
- do
- if (ss.available())
- {
- c = (char)ss.read();
- Serial.print(c);
- }
- while (c != '?');
-
- // Now listen on the second port
- ss2.listen();
-
- Serial.println("Data from the second port: ");
-}
-
-void loop()
-{
- if (ss2.available())
- {
- char c = (char)ss2.read();
- Serial.print(c);
- }
-}
-
diff --git a/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino b/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino
new file mode 100644
index 0000000..e870c6f
--- /dev/null
+++ b/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino
@@ -0,0 +1,78 @@
+/*
+ Software serial multple serial test
+
+ Receives from the two software serial ports,
+ sends to the hardware serial port.
+
+ In order to listen on a software port, you call port.listen().
+ When using two software serial ports, you have to switch ports
+ by listen()ing on each one in turn. Pick a logical time to switch
+ ports, like the end of an expected transmission, or when the
+ buffer is empty. This example switches ports when there is nothing
+ more to read from a port
+
+ The circuit:
+ Two devices which communicate serially are needed.
+ * First serial device's TX attached to digital pin 2, RX to pin 3
+ * Second serial device's TX attached to digital pin 4, RX to pin 5
+
+ created 18 Apr. 2011
+ by Tom Igoe
+ based on Mikal Hart's twoPortRXExample
+
+ This example code is in the public domain.
+
+ */
+
+#include <SoftwareSerial.h>
+// software serial #1: TX = digital pin 2, RX = digital pin 3
+SoftwareSerial portOne(2, 3);
+
+// software serial #2: TX = digital pin 4, RX = digital pin 5
+SoftwareSerial portTwo(4, 5);
+
+void setup()
+{
+ // Start the hardware serial port
+ Serial.begin(9600);
+
+ // Start each software serial port
+ portOne.begin(9600);
+ portTwo.begin(9600);
+}
+
+void loop()
+{
+ // By default, the last intialized port is listening.
+ // when you want to listen on a port, explicitly select it:
+ portOne.listen();
+ Serial.println("Data from port one:");
+ // while there is data coming in, read it
+ // and send to the hardware serial port:
+ while (portOne.available() > 0) {
+ char inByte = portOne.read();
+ Serial.write(inByte);
+ }
+
+ // blank line to separate data from the two ports:
+ Serial.println();
+
+ // Now listen on the second port
+ portTwo.listen();
+ // while there is data coming in, read it
+ // and send to the hardware serial port:
+ Serial.println("Data from port two:");
+ while (portTwo.available() > 0) {
+ char inByte = portTwo.read();
+ Serial.write(inByte);
+ }
+
+ // blank line to separate data from the two ports:
+ Serial.println();
+}
+
+
+
+
+
+
diff --git a/libraries/SoftwareSerial/icrmacros.h b/libraries/SoftwareSerial/icrmacros.h
deleted file mode 100755
index 936eae8..0000000
--- a/libraries/SoftwareSerial/icrmacros.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-icrmacros.h
-
-A place to put useful ICR (interrupt change register) macros
-
-If you want to support non-Arduino processors you can extend or replace
-this file.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-The latest version of this library can always be found at
-http://arduiniana.org.
-*/
-
-// Abstractions for maximum portability between processors
-// These are macros to associate pins to pin change interrupts
-#if !defined(digitalPinToPCICR) // Courtesy Paul Stoffregen
-
-#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
-
-#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
-#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
-#define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0))))
-#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14)))
-
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-// Specifically for the Arduino Mega 2560 (or 1280 on the original Arduino Mega)
-// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins)
-// Only pins available for RECEIVE (TRANSMIT can be on any pin):
-// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me)
-// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
-
-#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \
- (((p) >= 50) && ((p) <= 53)) || \
- (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) )
-
-#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \
- ( (((p) >= 62) && ((p) <= 69)) ? 2 : \
- 0 ) )
-
-#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \
- ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \
- ((uint8_t *)0) ) )
-
-#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \
- ( ((p) == 50) ? 3 : \
- ( ((p) == 51) ? 2 : \
- ( ((p) == 52) ? 1 : \
- ( ((p) == 53) ? 0 : \
- ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \
- 0 ) ) ) ) ) )
-
-#else
-#error This processor is not supported by SoftwareSerial
-#endif
-#endif
-