Software UART program using Infra-Red LED and IR-Detector
Dependents: TestVirtualisation Bf_SoftSerial_IR
SoftSerial_tx.cpp
- Committer:
- Sissors
- Date:
- 2014-04-26
- Revision:
- 1:f8b4b764ace7
- Parent:
- 0:8edaa7abe724
- Child:
- 2:9e01a38606b4
File content as of revision 1:f8b4b764ace7:
#include "SoftSerial.h" int SoftSerial::_putc(int c) { while(!writeable()); tx_bit = 0; _char = c; tx_handler(); return 0; } int SoftSerial::writeable(void) { if (!tx_en) return false; if (tx_bit == -1) return true; return false; } void SoftSerial::tx_handler(void) { if (get_bit(tx_bit) == -1) { 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) { 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; } } //Stop bits: if (bit < 1 + _bits + (bool)_parity + _stop_bits) return 1; return -1; }