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.
This commit is contained in:
Matthijs Kooijman 2013-06-04 11:30:26 +02:00
parent 934393398b
commit b1de3e6621
1 changed files with 6 additions and 4 deletions

View File

@ -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
}