aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthijs Kooijman <matthijs@stdin.nl>2013-06-04 11:30:26 +0200
committerMatthijs Kooijman <matthijs@stdin.nl>2015-01-26 17:03:25 +0100
commitcb36793486dd8d8d91c16984c423dbad4f4710a6 (patch)
tree207f89e2dff1d86e2945dc19e086879ce446f66a
parent3f02bcb49fca21a39d8c0d11c287addd9f7d7724 (diff)
Toggle SoftwareSerial interrupts when starting / stopping to listen
This prevents interrupts from triggering when the SoftwareSerial instance is not even listening. Additionally, this removes the need to disable interrupts in SoftwareSerial::listen, since no interrupts are active while it touches the variables.
-rw-r--r--libraries/SoftwareSerial/SoftwareSerial.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp
index a429f7d..b98451f 100644
--- a/libraries/SoftwareSerial/SoftwareSerial.cpp
+++ b/libraries/SoftwareSerial/SoftwareSerial.cpp
@@ -183,12 +183,14 @@ bool SoftwareSerial::listen()
if (active_object != this)
{
+ if (active_object)
+ active_object->stopListening();
+
_buffer_overflow = false;
- uint8_t oldSREG = SREG;
- cli();
_receive_buffer_head = _receive_buffer_tail = 0;
active_object = this;
- SREG = oldSREG;
+
+ setRxIntMsk(true);
return true;
}
@@ -200,6 +202,7 @@ bool SoftwareSerial::stopListening()
{
if (active_object == this)
{
+ setRxIntMsk(false);
active_object = NULL;
return true;
}
@@ -418,7 +421,6 @@ void SoftwareSerial::begin(long speed)
// (others might also need it, so we disable the interrupt by using
// the per-pin PCMSK register).
*digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
- setRxIntMsk(true);
tunedDelay(_tx_delay); // if we were low this establishes the end
}