From b1de3e66219bd220743333404b464bc1e16c774a Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 4 Jun 2013 11:30:26 +0200 Subject: [PATCH] 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. --- .../avr/libraries/SoftwareSerial/SoftwareSerial.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp index a429f7d2d..b98451f9e 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/hardware/arduino/avr/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 }