/* serial.c - serial functions. Part of Arduino - http://www.arduino.cc/ Copyright (c) 2005-2006 David A. Mellis 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include // Define constants and variables for buffering incoming serial data. We're // using a ring buffer (I think), in which rx_buffer_head is the index of the // location to which to write the next incoming character and rx_buffer_tail // is the index of the location from which to read. #ifdef __AVR_ATmega328P__ #define RX_BUFFER_SIZE 256 #else #define RX_BUFFER_SIZE 64 #endif #define TX_BUFFER_SIZE 16 uint8_t rx_buffer[RX_BUFFER_SIZE]; uint8_t rx_buffer_head = 0; uint8_t rx_buffer_tail = 0; uint8_t tx_buffer[TX_BUFFER_SIZE]; uint8_t tx_buffer_head = 0; volatile uint8_t tx_buffer_tail = 0; void beginSerial(long baud) { UBRR0H = ((F_CPU / 16 + baud / 2) / baud - 1) >> 8; UBRR0L = ((F_CPU / 16 + baud / 2) / baud - 1); /* baud doubler off - Only needed on Uno XXX */ UCSR0A &= ~(1 << U2X0); // enable rx and tx UCSR0B |= 1< 0) { buf[i++] = n % base; n /= base; } for (; i > 0; i--) printByte(buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10); } void printInteger(long n) { if (n < 0) { printByte('-'); n = -n; } printIntegerInBase(n, 10); } void printFloat(double n) { double integer_part, fractional_part; fractional_part = modf(n, &integer_part); printInteger(integer_part); printByte('.'); printInteger(round(fractional_part*1000)); }