diff options
author | Matthijs Kooijman <matthijs@stdin.nl> | 2013-06-04 11:30:26 +0200 |
---|---|---|
committer | Matthijs Kooijman <matthijs@stdin.nl> | 2015-01-26 17:03:25 +0100 |
commit | cb36793486dd8d8d91c16984c423dbad4f4710a6 (patch) | |
tree | 207f89e2dff1d86e2945dc19e086879ce446f66a /libraries/SoftwareSerial/SoftwareSerial.cpp | |
parent | 3f02bcb49fca21a39d8c0d11c287addd9f7d7724 (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.
Diffstat (limited to 'libraries/SoftwareSerial/SoftwareSerial.cpp')
-rw-r--r-- | libraries/SoftwareSerial/SoftwareSerial.cpp | 10 |
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
}
|