Fork of the original SoftSerial library with just a little modification in order to compile it with the current mbed version.

Dependents:   Adafruit_FONA_Library_FONAtest

Fork of SoftSerial by Erik -

Files at this revision

API Documentation at this revision

Comitter:
Sissors
Date:
Sat Apr 26 16:21:42 2014 +0000
Parent:
1:f8b4b764ace7
Child:
3:7238e9bb74d2
Commit message:
TX optimised to handle 19200 on LPC1768

Changed in this revision

SoftSerial.cpp Show annotated file Show diff for this revision Revisions of this file
SoftSerial.h Show annotated file Show diff for this revision Revisions of this file
SoftSerial_tx.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/SoftSerial.cpp	Sat Apr 26 15:13:01 2014 +0000
+++ b/SoftSerial.cpp	Sat Apr 26 16:21:42 2014 +0000
@@ -27,4 +27,5 @@
     _bits = bits;
     _parity = parity;
     _stop_bits = stop_bits;
+    _total_bits = 1 + _bits + _stop_bits + (bool)_parity;
 }
--- a/SoftSerial.h	Sat Apr 26 15:13:01 2014 +0000
+++ b/SoftSerial.h	Sat Apr 26 16:21:42 2014 +0000
@@ -86,7 +86,7 @@
     
     bool tx_en, rx_en;
     int bit_period;
-    int _bits, _stop_bits;
+    int _bits, _stop_bits, _total_bits;
     Parity _parity;
     
     void rx_gpio_irq_handler(void);
@@ -99,7 +99,7 @@
     
     //tx
     void tx_handler(void);
-    inline int get_bit(int bit);
+    void prepare_tx(int c);
     Timeout txout;
     int _char;
     volatile int tx_bit;
--- a/SoftSerial_tx.cpp	Sat Apr 26 15:13:01 2014 +0000
+++ b/SoftSerial_tx.cpp	Sat Apr 26 16:21:42 2014 +0000
@@ -1,14 +1,16 @@
 #include "SoftSerial.h"
 
-int SoftSerial::_putc(int c) {
+int SoftSerial::_putc(int c)
+{
     while(!writeable());
+    prepare_tx(c);
     tx_bit = 0;
-    _char = c;
     tx_handler();
     return 0;
-    }
+}
 
-int SoftSerial::writeable(void) {
+int SoftSerial::writeable(void)
+{
     if (!tx_en)
         return false;
     if (tx_bit == -1)
@@ -16,62 +18,52 @@
     return false;
 }
 
-void SoftSerial::tx_handler(void) {
-    if (get_bit(tx_bit) == -1) {
+void SoftSerial::tx_handler(void)
+{
+    if (tx_bit == _total_bits) {
         tx_bit = -1;
         return;
     }
-    
+
     //Flip output
     int cur_out = tx->read();
     tx->write(!cur_out);
-         
+
     //Calculate when to do it again
     int count = bit_period;
     tx_bit++;
-    while(get_bit(tx_bit) == !cur_out) {
+    while(((_char >> tx_bit) & 0x01) == !cur_out) {
         count+=bit_period;
         tx_bit++;
     }
-    
+
     txout.attach_us(this, &SoftSerial::tx_handler, count);
 }
 
-int SoftSerial::get_bit(int bit) {
-    //Start bit is never asked
-    
-    //Data bits
-    if (bit <= _bits )
-        return ((_char >> (bit - 1)) & 0x01);
-    
-    //Parity
-    bool retval;
-    if (bit == _bits + 1) {
-        switch (_parity) {
-            case Forced1:
-                return 1;
-            case Forced0:
-                return 0;
-            case Even:
-                retval = false;
-                for (int i = 0; i<_bits; i++) {
-                    if (((_char >> i) & 0x01) == 1)
-                        retval = !retval;
-                }
-                return retval;
-            case Odd:
-                retval = true;
-                for (int i = 0; i<_bits; i++) {
-                    if (((_char >> i) & 0x01) == 1)
-                        retval = !retval;
-                }
-                return retval;
-        }
+void SoftSerial::prepare_tx(int c)
+{
+    _char = c << 1;
+
+    bool parity;
+    switch (_parity) {
+        case Forced1:
+            _char |= 1 << (_bits + 1);
+        case Even:
+            parity = false;
+            for (int i = 0; i<_bits; i++) {
+                if (((_char >> i) & 0x01) == 1)
+                    parity = !parity;
+            }
+            _char |= parity << (_bits + 1);
+        case Odd:
+            parity = true;
+            for (int i = 0; i<_bits; i++) {
+                if (((_char >> i) & 0x01) == 1)
+                    parity = !parity;
+            }
+            _char |= parity << (_bits + 1);
     }
     
-    //Stop bits:
-    if (bit < 1 + _bits + (bool)_parity + _stop_bits) 
-        return 1;
-    
-    return -1;   
-}
\ No newline at end of file
+    _char |= 0xFFFF << (1 + _bits + (bool)_parity);
+    _char &= ~(1<<_total_bits);
+}