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 | |
| 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')
| -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
    }
 | 
