mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-10 21:24:12 +01:00
Adding software serial libraries. The read function doesn't quite work properly yet, but it's a start.
This commit is contained in:
parent
d21eb97de4
commit
f92fd4750c
225
targets/libraries/SoftwareSerial/SoftwareSerial.cpp
Executable file
225
targets/libraries/SoftwareSerial/SoftwareSerial.cpp
Executable file
@ -0,0 +1,225 @@
|
|||||||
|
/*
|
||||||
|
SoftwareSerial.cpp - Software serial library
|
||||||
|
Copyright (c) 2006 David A. Mellis. All right reserved.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Includes
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "WConstants.h"
|
||||||
|
#include "SoftwareSerial.h"
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Constructors
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin)
|
||||||
|
{
|
||||||
|
_receivePin = receivePin;
|
||||||
|
_transmitPin = transmitPin;
|
||||||
|
_baudRate = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* User API
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void SoftwareSerial::begin(long speed)
|
||||||
|
{
|
||||||
|
_baudRate = speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SoftwareSerial::read()
|
||||||
|
{
|
||||||
|
int val = 0;
|
||||||
|
int width = 1000000 / _baudRate;
|
||||||
|
int fudge = -8;
|
||||||
|
//int fudge = -16;
|
||||||
|
|
||||||
|
// one byte of serial data (LSB first)
|
||||||
|
// ...--\ /--\/--\/--\/--\/--\/--\/--\/--\/--...
|
||||||
|
// \--/\--/\--/\--/\--/\--/\--/\--/\--/
|
||||||
|
// start 0 1 2 3 4 5 6 7 stop
|
||||||
|
|
||||||
|
while (digitalRead(_receivePin));
|
||||||
|
|
||||||
|
// confirm that this is a real start bit, not line noise
|
||||||
|
if (digitalRead(_receivePin) == LOW) {
|
||||||
|
// frame start indicated by a falling edge and low start bit
|
||||||
|
// jump to the middle of the low start bit
|
||||||
|
delayMicroseconds(width / 2);
|
||||||
|
|
||||||
|
// offset of the bit in the byte: from 0 (LSB) to 7 (MSB)
|
||||||
|
for (int offset = 0; offset < 8; offset++) {
|
||||||
|
// jump to middle of next bit
|
||||||
|
delayMicroseconds(width + fudge);
|
||||||
|
|
||||||
|
// read bit
|
||||||
|
val |= digitalRead(_receivePin) << offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
delayMicroseconds(width + fudge);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(uint8_t b)
|
||||||
|
{
|
||||||
|
if (_baudRate == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int bitDelay = 1000000 / _baudRate - 15;
|
||||||
|
byte mask;
|
||||||
|
|
||||||
|
digitalWrite(_transmitPin, LOW);
|
||||||
|
delayMicroseconds(bitDelay);
|
||||||
|
|
||||||
|
for (mask = 0x01; mask; mask <<= 1) {
|
||||||
|
if (b & mask){ // choose bit
|
||||||
|
digitalWrite(_transmitPin,HIGH); // send 1
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
digitalWrite(_transmitPin,LOW); // send 1
|
||||||
|
}
|
||||||
|
delayMicroseconds(bitDelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
digitalWrite(_transmitPin, HIGH);
|
||||||
|
delayMicroseconds(bitDelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(char *s)
|
||||||
|
{
|
||||||
|
while (*s)
|
||||||
|
print(*s++);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(char c)
|
||||||
|
{
|
||||||
|
print((uint8_t) c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(int n)
|
||||||
|
{
|
||||||
|
print((long) n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(unsigned int n)
|
||||||
|
{
|
||||||
|
print((unsigned long) n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(long n)
|
||||||
|
{
|
||||||
|
if (n < 0) {
|
||||||
|
print('-');
|
||||||
|
n = -n;
|
||||||
|
}
|
||||||
|
printNumber(n, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(unsigned long n)
|
||||||
|
{
|
||||||
|
printNumber(n, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::print(long n, int base)
|
||||||
|
{
|
||||||
|
if (base == 0)
|
||||||
|
print((char) n);
|
||||||
|
else if (base == 10)
|
||||||
|
print(n);
|
||||||
|
else
|
||||||
|
printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(void)
|
||||||
|
{
|
||||||
|
print('\r');
|
||||||
|
print('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(char c)
|
||||||
|
{
|
||||||
|
print(c);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(char c[])
|
||||||
|
{
|
||||||
|
print(c);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(uint8_t b)
|
||||||
|
{
|
||||||
|
print(b);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(int n)
|
||||||
|
{
|
||||||
|
print(n);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(long n)
|
||||||
|
{
|
||||||
|
print(n);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(unsigned long n)
|
||||||
|
{
|
||||||
|
print(n);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareSerial::println(long n, int base)
|
||||||
|
{
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private Methods /////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void SoftwareSerial::printNumber(unsigned long n, uint8_t base)
|
||||||
|
{
|
||||||
|
unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
|
||||||
|
unsigned long i = 0;
|
||||||
|
|
||||||
|
if (n == 0) {
|
||||||
|
printByte('0');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (n > 0) {
|
||||||
|
buf[i++] = n % base;
|
||||||
|
n /= base;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i > 0; i--)
|
||||||
|
print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10));
|
||||||
|
}
|
55
targets/libraries/SoftwareSerial/SoftwareSerial.h
Executable file
55
targets/libraries/SoftwareSerial/SoftwareSerial.h
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
SoftwareSerial.h - Software serial library
|
||||||
|
Copyright (c) 2006 David A. Mellis. All right reserved.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SoftwareSerial_h
|
||||||
|
#define SoftwareSerial_h
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
class SoftwareSerial
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t _receivePin;
|
||||||
|
uint8_t _transmitPin;
|
||||||
|
long _baudRate;
|
||||||
|
void printNumber(unsigned long, uint8_t);
|
||||||
|
public:
|
||||||
|
SoftwareSerial(uint8_t, uint8_t);
|
||||||
|
void begin(long);
|
||||||
|
int read();
|
||||||
|
void print(char);
|
||||||
|
void print(char[]);
|
||||||
|
void print(uint8_t);
|
||||||
|
void print(int);
|
||||||
|
void print(unsigned int);
|
||||||
|
void print(long);
|
||||||
|
void print(unsigned long);
|
||||||
|
void print(long, int);
|
||||||
|
void println(void);
|
||||||
|
void println(char);
|
||||||
|
void println(char[]);
|
||||||
|
void println(uint8_t);
|
||||||
|
void println(int);
|
||||||
|
void println(long);
|
||||||
|
void println(unsigned long);
|
||||||
|
void println(long, int);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
18
targets/libraries/SoftwareSerial/keywords.txt
Normal file
18
targets/libraries/SoftwareSerial/keywords.txt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#######################################
|
||||||
|
# Syntax Coloring Map For Ultrasound
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Datatypes (KEYWORD1)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
SoftwareSerial KEYWORD1
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Constants (LITERAL1)
|
||||||
|
#######################################
|
||||||
|
|
Loading…
Reference in New Issue
Block a user