1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-03-01 23:29:28 +01:00

Merged upstream Arduino master branch

This commit is contained in:
Cristian Maglie 2012-06-26 00:51:35 +02:00
commit 46aeeb4b29
21 changed files with 176 additions and 134 deletions

View File

@ -139,7 +139,7 @@ public class Preferences {
"lv", "lv",
"lt", "lt",
"mr", "mr",
"no", "no_nb",
"fa", "fa",
"pl", "pl",
"pt_br", "pt_br",

View File

@ -127,10 +127,10 @@ public class SerialMonitor extends JFrame implements MessageConsumer {
serialRates = new JComboBox(); serialRates = new JComboBox();
for (int i = 0; i < serialRateStrings.length; i++) for (int i = 0; i < serialRateStrings.length; i++)
serialRates.addItem(serialRateStrings[i] + _(" baud")); serialRates.addItem(serialRateStrings[i] + " " + _("baud"));
serialRate = Preferences.getInteger("serial.debug_rate"); serialRate = Preferences.getInteger("serial.debug_rate");
serialRates.setSelectedItem(serialRate + _(" baud")); serialRates.setSelectedItem(serialRate + " " + _("baud"));
serialRates.addActionListener(new ActionListener() { serialRates.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { public void actionPerformed(ActionEvent event) {
String wholeString = (String) serialRates.getSelectedItem(); String wholeString = (String) serialRates.getSelectedItem();

View File

@ -1369,6 +1369,9 @@ public class Sketch {
for (SketchCode sc : code) { for (SketchCode sc : code) {
if (sc.isExtension("ino") || sc.isExtension("pde")) { if (sc.isExtension("ino") || sc.isExtension("pde")) {
sc.setPreprocOffset(bigCount); sc.setPreprocOffset(bigCount);
// These #line directives help the compiler report errors with
// correct the filename and line number (issue 281 & 907)
bigCode.append("#line 1 \"" + sc.getFileName() + "\"\n");
bigCode.append(sc.getProgram()); bigCode.append(sc.getProgram());
bigCode.append('\n'); bigCode.append('\n');
bigCount += sc.getLineCount(); bigCount += sc.getLineCount();
@ -1541,54 +1544,16 @@ public class Sketch {
public RunnerException placeException(String message, public RunnerException placeException(String message,
String dotJavaFilename, String dotJavaFilename,
int dotJavaLine) { int dotJavaLine) {
int codeIndex = 0; //-1; // Placing errors is simple, because we inserted #line directives
int codeLine = -1; // into the preprocessed source. The compiler gives us correct
// the file name and line number. :-)
// System.out.println("placing " + dotJavaFilename + " " + dotJavaLine); for (int codeIndex = 0; codeIndex < getCodeCount(); codeIndex++) {
// System.out.println("code count is " + getCodeCount()); SketchCode code = getCode(codeIndex);
if (dotJavaFilename.equals(code.getFileName())) {
// first check to see if it's a .java file return new RunnerException(message, codeIndex, dotJavaLine);
for (int i = 0; i < getCodeCount(); i++) { }
SketchCode code = getCode(i); }
if (!code.isExtension(getDefaultExtension())) { return null;
if (dotJavaFilename.equals(code.getFileName())) {
codeIndex = i;
codeLine = dotJavaLine;
return new RunnerException(message, codeIndex, codeLine);
}
}
}
// If not the preprocessed file at this point, then need to get out
if (!dotJavaFilename.equals(name + ".cpp")) {
return null;
}
// if it's not a .java file, codeIndex will still be 0
// this section searches through the list of .pde files
codeIndex = 0;
for (int i = 0; i < getCodeCount(); i++) {
SketchCode code = getCode(i);
if (code.isExtension(getDefaultExtension())) {
// System.out.println("preproc offset is " + code.getPreprocOffset());
// System.out.println("looking for line " + dotJavaLine);
if (code.getPreprocOffset() <= dotJavaLine) {
codeIndex = i;
// System.out.println("i'm thinkin file " + i);
codeLine = dotJavaLine - code.getPreprocOffset();
}
}
}
// could not find a proper line number, so deal with this differently.
// but if it was in fact the .java file we're looking for, though,
// send the error message through.
// this is necessary because 'import' statements will be at a line
// that has a lower number than the preproc offset, for instance.
// if (codeLine == -1 && !dotJavaFilename.equals(name + ".java")) {
// return null;
// }
return new RunnerException(message, codeIndex, codeLine);
} }

View File

@ -54,6 +54,7 @@ public class Compiler implements MessageConsumer {
private PreferencesMap prefs; private PreferencesMap prefs;
private boolean verbose; private boolean verbose;
private boolean sketchIsCompiled;
private RunnerException exception; private RunnerException exception;
@ -71,6 +72,7 @@ public class Compiler implements MessageConsumer {
throws RunnerException { throws RunnerException {
sketch = _sketch; sketch = _sketch;
verbose = _verbose; verbose = _verbose;
sketchIsCompiled = false;
objectFiles = new ArrayList<File>(); objectFiles = new ArrayList<File>();
prefs = createBuildPreferences(_buildPath, _primaryClassName); prefs = createBuildPreferences(_buildPath, _primaryClassName);
@ -87,6 +89,7 @@ public class Compiler implements MessageConsumer {
// 1. compile the sketch (already in the buildPath) // 1. compile the sketch (already in the buildPath)
sketch.setCompilingProgress(30); sketch.setCompilingProgress(30);
compileSketch(includePaths); compileSketch(includePaths);
sketchIsCompiled = true;
// 2. compile the libraries, outputting .o files to: <buildPath>/<library>/ // 2. compile the libraries, outputting .o files to: <buildPath>/<library>/
// Doesn't really use configPreferences // Doesn't really use configPreferences
@ -339,10 +342,8 @@ public class Compiler implements MessageConsumer {
boolean compiling = true; boolean compiling = true;
while (compiling) { while (compiling) {
try { try {
if (in.thread != null) in.join();
in.thread.join(); err.join();
if (err.thread != null)
err.thread.join();
result = process.waitFor(); result = process.waitFor();
//System.out.println("result is " + result); //System.out.println("result is " + result);
compiling = false; compiling = false;
@ -430,7 +431,7 @@ public class Compiler implements MessageConsumer {
if (pieces[3].trim().equals("'Udp' was not declared in this scope")) { if (pieces[3].trim().equals("'Udp' was not declared in this scope")) {
error = _("The Udp class has been renamed EthernetUdp."); error = _("The Udp class has been renamed EthernetUdp.");
msg = _("\nAs of Arduino 1.0, the Udp class in the Ethernet library " + msg = _("\nAs of Arduino 1.0, the Udp class in the Ethernet library " +
"has been renamed to EthernetClient.\n\n"); "has been renamed to EthernetUdp.\n\n");
} }
if (pieces[3].trim().equals("'class TwoWire' has no member named 'send'")) { if (pieces[3].trim().equals("'class TwoWire' has no member named 'send'")) {
@ -455,14 +456,20 @@ public class Compiler implements MessageConsumer {
//msg = _("\nThe 'Keyboard' class is only supported on the Arduino Leonardo.\n\n"); //msg = _("\nThe 'Keyboard' class is only supported on the Arduino Leonardo.\n\n");
} }
RunnerException e = sketch.placeException(error, pieces[1], PApplet.parseInt(pieces[2]) - 1); RunnerException e = null;
if (!sketchIsCompiled) {
// Place errors when compiling the sketch, but never while compiling libraries
// or the core. The user's sketch might contain the same filename!
e = sketch.placeException(error, pieces[1], PApplet.parseInt(pieces[2]) - 1);
}
// replace full file path with the name of the sketch tab (unless we're // replace full file path with the name of the sketch tab (unless we're
// in verbose mode, in which case don't modify the compiler output) // in verbose mode, in which case don't modify the compiler output)
if (e != null && !verbose) { if (e != null && !verbose) {
SketchCode code = sketch.getCode(e.getCodeIndex()); SketchCode code = sketch.getCode(e.getCodeIndex());
String fileName = code.isExtension(sketch.getDefaultExtension()) ? code.getPrettyName() : code.getFileName(); String fileName = (code.isExtension("ino") || code.isExtension("pde")) ? code.getPrettyName() : code.getFileName();
s = fileName + ":" + e.getCodeLine() + ": error: " + pieces[3] + msg; int lineNum = e.getCodeLine() + 1;
s = fileName + ":" + lineNum + ": error: " + pieces[3] + msg;
} }
if (exception == null && e != null) { if (exception == null && e != null) {

View File

@ -85,8 +85,15 @@ public class MessageSiphon implements Runnable {
} }
} }
// Wait until the MessageSiphon thread is complete.
public void join() throws java.lang.InterruptedException {
// Grab a temp copy in case another thread nulls the "thread"
// member variable
Thread t = thread;
if (t != null) t.join();
}
public Thread getThread() { public Thread getThread() {
return thread; return thread;
} }
} }

View File

@ -60,10 +60,8 @@ public class Sizer implements MessageConsumer {
boolean running = true; boolean running = true;
while(running) { while(running) {
try { try {
if (in.thread != null) in.join();
in.thread.join(); err.join();
if (err.thread != null)
err.thread.join();
r = process.waitFor(); r = process.waitFor();
running = false; running = false;
} catch (InterruptedException intExc) { } } catch (InterruptedException intExc) { }

View File

@ -205,7 +205,7 @@ public class PdePreprocessor {
for (int i = 0; i < prototypes.size(); i++) { for (int i = 0; i < prototypes.size(); i++) {
out.print(prototypes.get(i) + "\n"); out.print(prototypes.get(i) + "\n");
} }
out.println("#line 1");
out.print(program.substring(prototypeInsertionPoint)); out.print(program.substring(prototypeInsertionPoint));
} }

View File

@ -56,7 +56,7 @@ public class Archiver implements Tool {
numberFormat.setGroupingUsed(false); // no commas numberFormat.setGroupingUsed(false); // no commas
numberFormat.setMinimumIntegerDigits(digits); numberFormat.setMinimumIntegerDigits(digits);
dateFormat = new SimpleDateFormat(_("yyMMdd")); dateFormat = new SimpleDateFormat("yyMMdd");
} }

View File

@ -9,8 +9,8 @@
* 4.7K resistor on analog 0 to ground * 4.7K resistor on analog 0 to ground
created 21 Jan 2010 created 21 Jan 2010
modified 9 Apr 2012 modified 31 May 2012
by Tom Igoe by Tom Igoe, with suggestion from Michael Flynn
This example code is in the public domain. This example code is in the public domain.
@ -29,10 +29,11 @@ void loop() {
int sensorReading = analogRead(A0); int sensorReading = analogRead(A0);
// print the sensor reading so you know its range // print the sensor reading so you know its range
Serial.println(sensorReading); Serial.println(sensorReading);
// map the pitch to the range of the analog input. // map the analog input range (in this case, 400 - 1000 from the photoresistor)
// to the output pitch range (120 - 1500Hz)
// change the minimum and maximum input numbers below // change the minimum and maximum input numbers below
// depending on the range your sensor's giving: // depending on the range your sensor's giving:
int thisPitch = map(sensorReading, 400, 1000, 100, 1000); int thisPitch = map(sensorReading, 400, 1000, 120, 1500);
// play the pitch: // play the pitch:
tone(9, thisPitch, 10); tone(9, thisPitch, 10);

View File

@ -226,6 +226,9 @@ size_t Print::printFloat(double number, uint8_t digits)
{ {
size_t n = 0; size_t n = 0;
if (isnan(number)) return print("nan");
if (isinf(number)) return print("inf");
// Handle negative numbers // Handle negative numbers
if (number < 0.0) if (number < 0.0)
{ {

View File

@ -46,7 +46,10 @@ class Print
void clearWriteError() { setWriteError(0); } void clearWriteError() { setWriteError(0); }
virtual size_t write(uint8_t) = 0; virtual size_t write(uint8_t) = 0;
size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); } size_t write(const char *str) {
if (str == NULL) return 0;
return write((const uint8_t *)str, strlen(str));
}
virtual size_t write(const uint8_t *buffer, size_t size); virtual size_t write(const uint8_t *buffer, size_t size);
size_t print(const __FlashStringHelper *); size_t print(const __FlashStringHelper *);

View File

@ -39,6 +39,7 @@ public:
virtual int read(void); virtual int read(void);
virtual void flush(void); virtual void flush(void);
virtual size_t write(uint8_t); virtual size_t write(uint8_t);
using Print::write; // pull in write(str) and write(buf, size) from Print
operator bool(); operator bool();
}; };
extern Serial_ Serial; extern Serial_ Serial;

View File

@ -59,6 +59,14 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
EICRA = (EICRA & ~((1<<ISC10) | (1<<ISC11))) | (mode << ISC10); EICRA = (EICRA & ~((1<<ISC10) | (1<<ISC11))) | (mode << ISC10);
EIMSK |= (1<<INT1); EIMSK |= (1<<INT1);
break; break;
case 2:
EICRA = (EICRA & ~((1<<ISC20) | (1<<ISC21))) | (mode << ISC20);
EIMSK |= (1<<INT2);
break;
case 3:
EICRA = (EICRA & ~((1<<ISC30) | (1<<ISC31))) | (mode << ISC30);
EIMSK |= (1<<INT3);
break;
#elif defined(EICRA) && defined(EICRB) && defined(EIMSK) #elif defined(EICRA) && defined(EICRB) && defined(EIMSK)
case 2: case 2:
EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
@ -147,12 +155,18 @@ void detachInterrupt(uint8_t interruptNum) {
// ATmega8. There, INT0 is 6 and INT1 is 7.) // ATmega8. There, INT0 is 6 and INT1 is 7.)
switch (interruptNum) { switch (interruptNum) {
#if defined(__AVR_ATmega32U4__) #if defined(__AVR_ATmega32U4__)
case 0: case 0:
EIMSK &= ~(1<<INT0); EIMSK &= ~(1<<INT0);
break; break;
case 1: case 1:
EIMSK &= ~(1<<INT1); EIMSK &= ~(1<<INT1);
break; break;
case 2:
EIMSK &= ~(1<<INT2);
break;
case 3:
EIMSK &= ~(1<<INT3);
break;
#elif defined(EICRA) && defined(EICRB) && defined(EIMSK) #elif defined(EICRA) && defined(EICRB) && defined(EIMSK)
case 2: case 2:
EIMSK &= ~(1 << INT0); EIMSK &= ~(1 << INT0);
@ -226,6 +240,16 @@ SIGNAL(INT1_vect) {
intFunc[EXTERNAL_INT_1](); intFunc[EXTERNAL_INT_1]();
} }
SIGNAL(INT2_vect) {
if(intFunc[EXTERNAL_INT_2])
intFunc[EXTERNAL_INT_2]();
}
SIGNAL(INT3_vect) {
if(intFunc[EXTERNAL_INT_3])
intFunc[EXTERNAL_INT_3]();
}
#elif defined(EICRA) && defined(EICRB) #elif defined(EICRA) && defined(EICRB)
SIGNAL(INT0_vect) { SIGNAL(INT0_vect) {

View File

@ -56,6 +56,8 @@ extern "C"{
#define EXTERNAL_NUM_INTERRUPTS 8 #define EXTERNAL_NUM_INTERRUPTS 8
#elif defined(__AVR_ATmega1284P__) #elif defined(__AVR_ATmega1284P__)
#define EXTERNAL_NUM_INTERRUPTS 3 #define EXTERNAL_NUM_INTERRUPTS 3
#elif defined(__AVR_ATmega32U4__)
#define EXTERNAL_NUM_INTERRUPTS 4
#else #else
#define EXTERNAL_NUM_INTERRUPTS 2 #define EXTERNAL_NUM_INTERRUPTS 2
#endif #endif

View File

@ -166,44 +166,43 @@ static const pin_map_t digitalPinMap[] = {
}; };
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#elif defined(__AVR_ATmega32U4__) #elif defined(__AVR_ATmega32U4__)
// Teensy 2.0 // Leonardo
// Two Wire (aka I2C) ports // Two Wire (aka I2C) ports
uint8_t const SDA_PIN = 6; uint8_t const SDA_PIN = 2;
uint8_t const SCL_PIN = 5; uint8_t const SCL_PIN = 3;
// SPI port // SPI port
uint8_t const SS_PIN = 0; uint8_t const SS_PIN = 17;
uint8_t const MOSI_PIN = 2; uint8_t const MOSI_PIN = 16;
uint8_t const MISO_PIN = 3; uint8_t const MISO_PIN = 14;
uint8_t const SCK_PIN = 1; uint8_t const SCK_PIN = 15;
static const pin_map_t digitalPinMap[] = { static const pin_map_t digitalPinMap[] = {
{&DDRB, &PINB, &PORTB, 0}, // B0 0 {&DDRD, &PIND, &PORTD, 2}, // D2 0
{&DDRB, &PINB, &PORTB, 1}, // B1 1 {&DDRD, &PIND, &PORTD, 3}, // D3 1
{&DDRB, &PINB, &PORTB, 2}, // B2 2 {&DDRD, &PIND, &PORTD, 1}, // D1 2
{&DDRB, &PINB, &PORTB, 3}, // B3 3 {&DDRD, &PIND, &PORTD, 0}, // D0 3
{&DDRB, &PINB, &PORTB, 7}, // B7 4 {&DDRD, &PIND, &PORTD, 4}, // D4 4
{&DDRD, &PIND, &PORTD, 0}, // D0 5 {&DDRC, &PINC, &PORTC, 6}, // C6 5
{&DDRD, &PIND, &PORTD, 1}, // D1 6 {&DDRD, &PIND, &PORTD, 7}, // D7 6
{&DDRD, &PIND, &PORTD, 2}, // D2 7 {&DDRE, &PINE, &PORTE, 6}, // E6 7
{&DDRD, &PIND, &PORTD, 3}, // D3 8 {&DDRB, &PINB, &PORTB, 4}, // B4 8
{&DDRC, &PINC, &PORTC, 6}, // C6 9 {&DDRB, &PINB, &PORTB, 5}, // B5 9
{&DDRC, &PINC, &PORTC, 7}, // C7 10 {&DDRB, &PINB, &PORTB, 6}, // B6 10
{&DDRD, &PIND, &PORTD, 6}, // D6 11 {&DDRB, &PINB, &PORTB, 7}, // B7 11
{&DDRD, &PIND, &PORTD, 7}, // D7 12 {&DDRD, &PIND, &PORTD, 6}, // D6 12
{&DDRB, &PINB, &PORTB, 4}, // B4 13 {&DDRC, &PINC, &PORTC, 7}, // C7 13
{&DDRB, &PINB, &PORTB, 5}, // B5 14 {&DDRB, &PINB, &PORTB, 3}, // B3 14
{&DDRB, &PINB, &PORTB, 6}, // B6 15 {&DDRB, &PINB, &PORTB, 1}, // B1 15
{&DDRF, &PINF, &PORTF, 7}, // F7 16 {&DDRB, &PINB, &PORTB, 2}, // B2 16
{&DDRF, &PINF, &PORTF, 6}, // F6 17 {&DDRB, &PINB, &PORTB, 0}, // B0 17
{&DDRF, &PINF, &PORTF, 5}, // F5 18 {&DDRF, &PINF, &PORTF, 7}, // F7 18
{&DDRF, &PINF, &PORTF, 4}, // F4 19 {&DDRF, &PINF, &PORTF, 6}, // F6 19
{&DDRF, &PINF, &PORTF, 1}, // F1 20 {&DDRF, &PINF, &PORTF, 5}, // F5 20
{&DDRF, &PINF, &PORTF, 0}, // F0 21 {&DDRF, &PINF, &PORTF, 4}, // F4 21
{&DDRD, &PIND, &PORTD, 4}, // D4 22 {&DDRF, &PINF, &PORTF, 1}, // F1 22
{&DDRD, &PIND, &PORTD, 5}, // D5 23 {&DDRF, &PINF, &PORTF, 0}, // F0 23
{&DDRE, &PINE, &PORTE, 6} // E6 24
}; };
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)

View File

@ -14,27 +14,32 @@
SPIClass SPI; SPIClass SPI;
void SPIClass::begin() { void SPIClass::begin() {
// Set direction register for SCK and MOSI pin.
// MISO pin automatically overrides to INPUT. // Set SS to high so a connected chip will be "deselected" by default
digitalWrite(SS, HIGH);
// When the SS pin is set as OUTPUT, it can be used as // When the SS pin is set as OUTPUT, it can be used as
// a general purpose output port (it doesn't influence // a general purpose output port (it doesn't influence
// SPI operations). // SPI operations).
pinMode(SCK, OUTPUT);
pinMode(MOSI, OUTPUT);
pinMode(SS, OUTPUT); pinMode(SS, OUTPUT);
digitalWrite(SCK, LOW);
digitalWrite(MOSI, LOW);
digitalWrite(SS, HIGH);
// Warning: if the SS pin ever becomes a LOW INPUT then SPI // Warning: if the SS pin ever becomes a LOW INPUT then SPI
// automatically switches to Slave, so the data direction of // automatically switches to Slave, so the data direction of
// the SS pin MUST be kept as OUTPUT. // the SS pin MUST be kept as OUTPUT.
SPCR |= _BV(MSTR); SPCR |= _BV(MSTR);
SPCR |= _BV(SPE); SPCR |= _BV(SPE);
// Set direction register for SCK and MOSI pin.
// MISO pin automatically overrides to INPUT.
// By doing this AFTER enabling SPI, we avoid accidentally
// clocking in a single bit since the lines go directly
// from "input" to SPI control.
// http://code.google.com/p/arduino/issues/detail?id=888
pinMode(SCK, OUTPUT);
pinMode(MOSI, OUTPUT);
} }
void SPIClass::end() { void SPIClass::end() {
SPCR &= ~_BV(SPE); SPCR &= ~_BV(SPE);
} }

View File

@ -5,11 +5,20 @@
Receives from software serial, sends to hardware serial. Receives from software serial, sends to hardware serial.
The circuit: The circuit:
* RX is digital pin 2 (connect to TX of other device) * RX is digital pin 10 (connect to TX of other device)
* TX is digital pin 3 (connect to RX of other device) * TX is digital pin 11 (connect to RX of other device)
Note:
Not all pins on the Mega and Mega 2560 support change interrupts,
so only the following can be used for RX:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
Not all pins on the Leonardo support change interrupts,
so only the following can be used for RX:
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
created back in the mists of time created back in the mists of time
modified 9 Apr 2012 modified 25 May 2012
by Tom Igoe by Tom Igoe
based on Mikal Hart's example based on Mikal Hart's example
@ -18,13 +27,13 @@
*/ */
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX SoftwareSerial mySerial(10, 11); // RX, TX
void setup() void setup()
{ {
// Open serial communications and wait for port to open: // Open serial communications and wait for port to open:
Serial.begin(57600); Serial.begin(57600);
while (!Serial) { while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only ; // wait for serial port to connect. Needed for Leonardo only
} }
@ -43,3 +52,4 @@ void loop() // run over and over
if (Serial.available()) if (Serial.available())
mySerial.write(Serial.read()); mySerial.write(Serial.read());
} }

View File

@ -16,8 +16,17 @@
* First serial device's TX attached to digital pin 2, RX to pin 3 * First serial device's TX attached to digital pin 2, RX to pin 3
* Second serial device's TX attached to digital pin 4, RX to pin 5 * Second serial device's TX attached to digital pin 4, RX to pin 5
Note:
Not all pins on the Mega and Mega 2560 support change interrupts,
so only the following can be used for RX:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
Not all pins on the Leonardo support change interrupts,
so only the following can be used for RX:
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
created 18 Apr. 2011 created 18 Apr. 2011
modified 9 Apr 2012 modified 25 May 2012
by Tom Igoe by Tom Igoe
based on Mikal Hart's twoPortRXExample based on Mikal Hart's twoPortRXExample
@ -26,11 +35,12 @@
*/ */
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
// software serial #1: TX = digital pin 2, RX = digital pin 3 // software serial #1: TX = digital pin 10, RX = digital pin 11
SoftwareSerial portOne(2, 3); SoftwareSerial portOne(10,11);
// software serial #2: TX = digital pin 4, RX = digital pin 5 // software serial #2: TX = digital pin 8, RX = digital pin 9
SoftwareSerial portTwo(4, 5); // on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial portTwo(8,9);
void setup() void setup()
{ {

View File

@ -219,6 +219,9 @@ size_t Print::printFloat(double number, uint8_t digits)
{ {
size_t n = 0; size_t n = 0;
if (isnan(number)) return print("nan");
if (isinf(number)) return print("inf");
// Handle negative numbers // Handle negative numbers
if (number < 0.0) if (number < 0.0)
{ {

View File

@ -46,7 +46,10 @@ class Print
void clearWriteError() { setWriteError(0); } void clearWriteError() { setWriteError(0); }
virtual size_t write(uint8_t) = 0; virtual size_t write(uint8_t) = 0;
size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); } size_t write(const char *str) {
if (str == NULL) return 0;
return write((const uint8_t *)str, strlen(str));
}
virtual size_t write(const uint8_t *buffer, size_t size); virtual size_t write(const uint8_t *buffer, size_t size);
size_t print(const __FlashStringHelper *); size_t print(const __FlashStringHelper *);

View File

@ -57,6 +57,7 @@ public:
virtual int read(void); virtual int read(void);
virtual void flush(void); virtual void flush(void);
virtual size_t write(uint8_t); virtual size_t write(uint8_t);
using Print::write; // pull in write(str) and write(buf, size) from Print
operator bool(); operator bool();
}; };
extern Serial_ Serial; extern Serial_ Serial;