<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arduiniana &#187; Arduino libraries</title>
	<atom:link href="http://arduiniana.org/tag/arduino-libraries/feed/" rel="self" type="application/rss+xml" />
	<link>http://arduiniana.org</link>
	<description>Arduino software jewellery and wisdom by Mikal Hart</description>
	<lastBuildDate>Mon, 30 Aug 2010 05:51:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>New Year Treat: NewSoftSerial 10</title>
		<link>http://arduiniana.org/2010/01/newsoftserial-10/</link>
		<comments>http://arduiniana.org/2010/01/newsoftserial-10/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 18:47:03 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://arduiniana.org/?p=597</guid>
		<description><![CDATA[NewSoftSerial 10 is available for testing. There are a number of fun new features to play with, including support for 20MHz processors and Arduino siblings like the Teensy and Teensy++.  I&#8217;ve also added a destructor (and an end()) so that you can employ temporary NewSoftSerial objects, for example:
if (need_to_check_GPS)
{
  NewSoftSerial gpsconn(6, 3);
  ...
} [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http:newsoftserial">NewSoftSerial 10</a> is available for testing. There are a number of fun new features to play with, including support for 20MHz processors and Arduino siblings like the Teensy and Teensy++.  I&#8217;ve also added a destructor (and an end()) so that you can employ temporary NewSoftSerial objects, for example:</p>
<pre>if (need_to_check_GPS)
{
  NewSoftSerial gpsconn(6, 3);
  ...
} // Object is destroyed/cleaned up here</pre>
<p>Another useful new feature is the support for serial devices which use inverted TTL signalling &#8212; where &#8220;HIGH&#8221; is 0 and &#8220;LOW&#8221; 1. To enable automatic inversion, simply provide a boolean &#8220;true&#8221; as the third parameter in the constructor:</p>
<pre>NewSoftSerial nssinv(3, 2, true); //uses inverted signalling</pre>
<p>Could someone please test? I don&#8217;t have any inverse logic devices.</p>
<p>Many thanks to Garrett Mace and Paul Stoffregen for their contributions!</p>
<p><em>Update: Please upgrade to version 10c.  10b was a defective posting.</em></p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2010/01/newsoftserial-10/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Direct Port I/O in NewSoftSerial 9</title>
		<link>http://arduiniana.org/2009/05/direct-port-io-in-newsoftserial-9/</link>
		<comments>http://arduiniana.org/2009/05/direct-port-io-in-newsoftserial-9/#comments</comments>
		<pubDate>Fri, 22 May 2009 05:52:41 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://arduiniana.org/?p=352</guid>
		<description><![CDATA[NewSoftSerial 9 is now available.  This is a major new release that replaces all the performance path pin reads and writes with direct Port I/O.
What does that give you?  Well, a couple of things.  Most importantly, it makes NewSoftSerial more compatible with the latest Arduino release.  Changes to timings of digitalRead and digitalWrite in Arduino [...]]]></description>
			<content:encoded><![CDATA[<p>NewSoftSerial 9 is now <a href="http:NewSoftSerial">available</a>.  This is a major new release that replaces all the performance path pin reads and writes with direct Port I/O.</p>
<p>What does that give you?  Well, a couple of things.  Most importantly, it makes NewSoftSerial more compatible with the latest Arduino release.  Changes to timings of digitalRead and digitalWrite in Arduino 0015 broke NewSoftSerial at higher baud rates.  All software serial libraries are timing sensitive, and even a microsecond or two change in a function&#8217;s timing can introduce enough error to fatally corrupt serial transmissions.  By using direct port I/O and retuning all the timing tables, we avoid problems caused by the longer digitalReads and digitalWrites.  Furthermore, the library should be more immune to future changes of this kind.</p>
<p>Direct port I/O is amazingly fast &#8212; about 10-25 times faster than the equivalent call to digitalRead/Write.  Because of this, NewSoftSerial 9 is able to operate reliably at higher baud rates than in the past.  In my test suite, I am now able to get reliable RX at speeds up to an unprecedented 57.6K baud on a 16MHz processor and 31.25K baud at 8MHz*.  Because the performance paths no longer use digitalRead/Write, they are less sluggish and much easier to tune to the higher speeds.</p>
<p>*These figures are about 70% higher than NewSoftSerial 8 with Arduino 0014.  These were measured using USB-powered Arduinos running a prerelease v. 0016 copy of the software, which optimizes the timer 0 overflow counter &#8212; an important contributor to software serial performance.  I/O was tightly controlled to avoid overflow, which can easily occur at high baud rates when you have no hardware flow control.</p>
<p>Please let me know what you think.  The new version is <a href="http:NewSoftSerial">here</a>.</p>
<p>What&#8217;s next for NewSoftSerial?  Well, there are a number of things being asked for:</p>
<ul>
<li>Arduino Mega support</li>
<li>Signal inversion option</li>
<li>RTS/CTS flow control option</li>
<li>Configurability, i.e. &#8220;E, 7, 1&#8243; style parity, data and stopbit configuration.</li>
</ul>
<p>What are <em>you</em> most interested in?  Let me know here.</p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/05/direct-port-io-in-newsoftserial-9/feed/</wfw:commentRss>
		<slash:comments>92</slash:comments>
		</item>
		<item>
		<title>New NewSoftSerial coming</title>
		<link>http://arduiniana.org/2009/05/new-newsoftserial-coming/</link>
		<comments>http://arduiniana.org/2009/05/new-newsoftserial-coming/#comments</comments>
		<pubDate>Sat, 02 May 2009 22:54:33 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://arduiniana.org/?p=337</guid>
		<description><![CDATA[Changes in the timing of digitalRead and digitalWrite on 0015 have degraded NewSoftSerial&#8217;s and AFSoftSerial&#8217;s performance on this platform.  If you need software serial at higher baud rates, I recommend you stick with 0014 &#8212; at least until NewSoftSerial 9 comes out.
The good news is that version 9 has been optimized heavily and it [...]]]></description>
			<content:encoded><![CDATA[<p>Changes in the timing of digitalRead and digitalWrite on 0015 have degraded NewSoftSerial&#8217;s and AFSoftSerial&#8217;s performance on this platform.  If you need software serial at higher baud rates, I recommend you stick with 0014 &#8212; at least until NewSoftSerial 9 comes out.</p>
<p>The good news is that version 9 has been optimized heavily and it should prove to be the best version ever &#8212; and run on both 0015 and 0014.  Stay tuned!</p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/05/new-newsoftserial-coming/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>NewSoftSerial 8 for 8 (MHz)</title>
		<link>http://arduiniana.org/2009/04/newsoftserial-8/</link>
		<comments>http://arduiniana.org/2009/04/newsoftserial-8/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 04:08:21 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://arduiniana.org/?p=291</guid>
		<description><![CDATA[Over the last couple of weeks I&#8217;ve spent a fair number of hours in front of the logic analyzer, and the result is NewSoftSerial version 8. The major delta in this release is support for 8MHz processors.
The half-speed clock makes accurate serial reception considerably more difficult, but NewSoftSerial 8 still manages to transmit with 100% [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last couple of weeks I&#8217;ve spent a fair number of hours in front of the logic analyzer, and the result is <strong><a href="/libraries/NewSoftSerial">NewSoftSerial version 8</a></strong>. The major delta in this release is <strong style="mso-bidi-font-weight: normal">support for 8MHz processors</strong>.</p>
<p>The half-speed clock makes accurate serial reception considerably more difficult, but NewSoftSerial 8 still manages to transmit with 100% reliability up to 57.6K baud and receive up to 14.4K baud on the Arduino Pro.  Reception at rates up to 38.4K baud is 99+% reliable.  For a better understanding of why the slower processor caps RX at a relatively low baud rate, and for a trick to significantly improve this, read on.</p>
<h3>Flush</h3>
<p>The new library supports the flush() method, which works the same way that HardwareSerial’s flush() does.</p>
<pre>      void flush(); // discard the contents of the RX buffer.</pre>
<h3>PROGMEM use</h3>
<p>NewSoftSerial 8 has been reorganized to move some of the logic into a PROGMEM-based lookup table. You may encounter the following spurious warning message when you build your first NewSoftSerial 8 application:</p>
<pre style="COLOR: red; TEXT-ALIGN: left">    NewSoftSerial.cpp:68: warning: only initialized variables
    can be placed into program memory area</pre>
<p>Be assured that this message is completely harmless. As soon as I figure out how to remove it, I will.</p>
<h3>Potential trouble spots</h3>
<p>There are two problem areas that affect accuracy and cap RX speeds in all software serial libraries:</p>
<ul>
<li>interference from other interrupts in the system</li>
<li>RX interrupt floods/bursts</li>
</ul>
<p>Before I discuss these, an introduction to interrupt-driven serial reception may be in order.</p>
<h3>Interrupt-driven RX</h3>
<p>It all begins when the Arduino software RX pin, normally high, drops low. This is the “start bit” – the signal from the transmitter that bits of data are about to arrive in a sequence of pulses whose width is determined by the agreed-upon baud rate.  The pin&#8217;s state change triggers an interrupt which launches the NewSoftSerial recv() routine. Through a series of eight precisely timed samples, recv() assembles the new byte and stores it in a buffer before releasing the interrupt.</p>
<p>The top waveform in the image below shows the arrival of the letter ‘a’ (hex 61). The RX signal drops low (start bit) and then the data bits arrive, in order from lowest to highest, 1, 0, 0, 0, 0, 1, 1, 0, followed by a high “stop” bit. At each interval, the recv() routine samples the pin and records the bit value. The second waveform demonstrates this sampling process in action, one sample per falling edge.</p>
<p style="TEXT-ALIGN: center"><img class="aligncenter size-full wp-image-298" title="serial-good" src="http://arduiniana.org/wp-content/uploads/2009/04/serial-good.jpg" alt="serial-good" width="558" height="104" /></p>
<p style="text-align: center;"><em>Fig 1. The letter ‘a’ (hex 61) being sampled correctly</em></p>
<p>If all goes well, the received byte is identical to the one transmitted. And this is usually the case, because once the pin-change interrupt fires, NewSoftSerial&#8217;s precisely tuned recv() routine gains absolute control of the processor. Interrupts are disabled during the sampling, so there is no danger that a competing interrupt will corrupt the process.</p>
<p>The problem is that if another interrupt handler is already active when the start bit arrives, then NewSoftSerial&#8217;s pin-change handler is necessarily delayed until the competing routine exits.  If the delay is too long, the sampling routine may read the incoming byte incorrectly, causing it to be mangled or even lost.</p>
<p>When you encounter RX corruption or loss at high baud rates, the most common culprit is Arduino&#8217;s own timer overflow interrupt handler – the routine responsible for millis() and delay().  Consider: on an 8MHz Arduino the timer interrupt lasts a full 20µs, compared to only about 70µs for the entire width of a bit transmitted at 14.4K baud. If the timer interrupt fires at precisely the “wrong” time, i.e. just as a new start bit arrives, important processing may get delayed long enough to cause an error.</p>
<p>The picture below shows just such an event taking place. Comparing to the figure above, you’ll see that the system timer interrupt fires just before the “Serial” line goes low, shifting the sampling process to the right just enough to distort the sampled byte.</p>
<p style="text-align: center;"><em><img class="aligncenter size-full wp-image-297" title="serial-bad" src="http://arduiniana.org/wp-content/uploads/2009/04/serial-bad.jpg" alt="serial-bad" width="602" height="101" />Fig 2. A timer interrupt fatally delaying the sampling sequence<br />
</em></p>
<p>In cases like this, you’ll experience an invalid byte read. On 16MHz processors, the experimentally determined failure rate is quite low – less than 0.5% – and is only seen at the very highest supported baud rates (57600 and 38400) .  But at 8MHz, the problem is exacerbated by the fact that the timer tick interrupt takes twice as long to execute.  Not only is there a greater likelihood that the interrupts will collide unhappily, but because the timer tick is longer, the damage done when there <em>is</em> a collision is proportionally greater.  What this means is that NewSoftSerial running at 8MHz receives data with 100% accuracy only at baud rates less than half those which work reliably at 16MHz. If you want perfect accuracy with an 8MHz clock, stick to rates of 19200 or 14400 baud or less.  Or&#8230;</p>
<h3>Workaround: disabling the timer</h3>
<p>&#8230;if your application can do without the system timer, it is possible to significantly improve RX reliability by turning it off.  NewSoftSerial 8 provides a new method to disable/enable the clock by masking off its interrupt:</p>
<pre>      static void enable_timer0(bool enable);</pre>
<p>While disabling the timer more than doubles the speeds at which 8MHz NewSoftSerial can reliably receive data, it is not recommended that you do so unless you understand the ramifications. Don&#8217;t do it unless you really need perfect reliability at speeds greater than 14400 baud and can live without millis() and delay().  Many applications can absorb the low failures rates (&lt;1%) NewSoftSerial experiences at higher speeds.  For example, for serial GPS devices, <a href="http:libraries/TinyGPS">TinyGPS </a>automatically filters out NMEA sentences that fail the checksum.  This may be sufficient for your app&#8230; or not.</p>
<h3>Flooding/Bursting</h3>
<p>Another situation that can adversely affect data reception is when a peer sends rapid bursts of data (at any baud rate), flooding the Arduino. The bytes arrive one after another so quickly that NewSoftSerial stays constantly in the RX interrupt, filling the receive queue but never allowing it to be drained. This generates an overflow condition, which can be detected by examining NewSoftSerial’s overflow() routine – if your program can ever call it.</p>
<p>Even if it doesn’t trigger an overflow, a flood of bytes can cause problems at high speeds, because tiny errors in the timings that would otherwise have gone unnoticed accumulate.</p>
<p>The best way to avoid problems relating to “flooding” is to prevent them. Eventually I hope to add support for RTS/CTS flow control to NewSoftSerial. In the meanwhile, keep away from devices, especially high speed ones, that generate floods of data.</p>
<h3>Timer based options?</h3>
<p>I’ve had several discussions recently about whether it would be possible to implement a timer-based (as opposed to pin-change-based) software serial device in Arduino. Such a library would theoretically allow a number of simultaneously operating serial devices to coexist, because the interrupt times would be much shorter. However, based on my recent studies with the logic analyzer, I have begun to doubt whether a library that worked at reasonably high speeds could be built. There is just too much interference from other interrupts in the system.</p>
<h3>Conclusions</h3>
<p>Software serial devices are best running at lower baud rates, especially on 8MHz processors. If you need multiple reliable, high speed serial interfaces, consider ATmega328-based Duemilanove, which sports three hardware serial ports.</p>
<h3>Future Directions</h3>
<p>As I mentioned earlier, I will be working soon on implementing an RTS/CTS flow control mechanism to improve the interface with serial devices that tend to transmit in bursts.</p>
<p>The next version of NewSoftSerial will also likely support optional signal inversion.</p>
<p>A couple of people have also expressed interest in being able to more precisely configure the data and parity bits of serial protocol, especially, for example, the relatively popular “E/7/1”. It’s hard to assess exactly how desirable this is.  Who would support increasing the NewSoftSerial footprint by a few bytes in exchange for this kind of configurability?</p>
<h3>Download</h3>
<p>You can get the new version, as usual, in the &#8220;Libraries&#8221; section at <a href="http:Libraries/NewSoftSerial">NewSoftSerial</a>.</p>
<p>Mikal Hart</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/04/newsoftserial-8/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>New Streaming Library</title>
		<link>http://arduiniana.org/2009/04/new-streaming-library/</link>
		<comments>http://arduiniana.org/2009/04/new-streaming-library/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 02:27:29 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://arduiniana.org/?p=281</guid>
		<description><![CDATA[Thanks to Paul V. and Ben Combee for their useful suggestions on how to support line endings (C++ &#8220;endl&#8221;) and internal format manipulators, respectively, we now have a bona fide Streaming library.
With it, you can now write code like this:
Serial &#60;&#60; "A is " &#60;&#60; lettera &#60;&#60; "." &#60;&#60; endl;
lcd &#60;&#60; "The date is " [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to Paul V. and Ben Combee for their useful suggestions on how to support line endings (C++ &#8220;endl&#8221;) and internal format manipulators, respectively, we now have a bona fide <a href="/libraries/Streaming">Streaming library</a>.</p>
<p>With it, you can now write code like this:</p>
<pre><code>Serial &lt;&lt; "A is " &lt;&lt; lettera &lt;&lt; "." &lt;&lt; endl;
lcd &lt;&lt; "The date is " &lt;&lt; d &lt;&lt; "-" &lt;&lt; m &lt;&lt; "-" &lt;&lt; y &lt;&lt; ".";
  
eth &lt;&lt; "You can use modifiers too, for example:" &lt;&lt; endl;
Serial &lt;&lt; _BYTE(a) &lt;&lt; " is " &lt;&lt; _HEX(a) &lt;&lt; " in hex. " &lt;&lt; endl;</code></pre>
<p>And thanks <span style="text-decoration: underline;">very much</span> for all the Arduinians who have used and commented on Streaming.  Cool stuff.</p>
<p>The new library is available in the &#8220;Libraries&#8221; section or <a href="libraries/streaming">here</a>.</p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/04/new-streaming-library/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>New Flash library</title>
		<link>http://arduiniana.org/2009/03/new-flash-library/</link>
		<comments>http://arduiniana.org/2009/03/new-flash-library/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 16:58:38 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://sundial.org/arduino/?p=232</guid>
		<description><![CDATA[I wrote a new library, Flash, which abstracts away most of the complexity of PROGMEM programming. It provides String, Array, and Table types that make ROM-based data collections as easy to use as “normal” types. Each overrides the C++ [] operator, so to get at individual elements, one simply uses familiar array syntax. For example, [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a new library, <strong>Flash</strong>, which abstracts away most of the complexity of PROGMEM programming. It provides String, Array, and Table types that make ROM-based data collections as easy to use as “normal” types. Each overrides the C++ [] operator, so to get at individual elements, one simply uses familiar array syntax. For example, if you have 1000 floating point temperatures in a flash-based “temperature_table” array, you might write code like this:</p>
<pre>for (int i=0; i&lt;temperature_table.count(); ++i)
  if (temperature_table[i] &gt; 98.6)
    Serial.println(temperature_table[i]);</pre>
<p>Interested to learn more? Read all about it <a href="/libraries/Flash">here</a>!</p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/03/new-flash-library/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>TinyGPS 8 released</title>
		<link>http://arduiniana.org/2009/03/tinygps-8-released/</link>
		<comments>http://arduiniana.org/2009/03/tinygps-8-released/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 04:47:55 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://sundial.org/arduino/?p=212</guid>
		<description><![CDATA[Thanks to a helpful suggestion by user DanP, I have increased the effective resolution of the latitude and longitude values returned in TinyGPS.  The get_position method now returns values in units of 10-5 degrees, a 10-fold increase in resolution.  Note that if you use use the old get_position, you will have to make some minor [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to a helpful suggestion by user DanP, I have increased the effective resolution of the latitude and longitude values returned in <a href="/libraries/TinyGPS">TinyGPS</a>.  The get_position method now returns values in units of 10<sup>-5</sup> degrees, a 10-fold increase in resolution.  Note that if you use use the old get_position, you will have to make some minor changes to your code if you upgrade to version 8.</p>
<p>Thanks DanP!</p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/03/tinygps-8-released/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>NewSoftSerial 6</title>
		<link>http://arduiniana.org/2009/02/newsoftserial-6/</link>
		<comments>http://arduiniana.org/2009/02/newsoftserial-6/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 20:08:55 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://sundial.org/arduino/?p=202</guid>
		<description><![CDATA[Ladyada tested NewSoftSerial and made some improvements to the code, contributed a &#8220;goodnight moon&#8221; sketch, and tested the library (successfully) with the Atmega328p processor.  Thanks, ladyada!  Go buy a bunch of processors from her, please.  They give you twice the RAM and nearly twice the flash space.
I posted the new library.
&#8230;goodnight moon. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.adafruit.com/">Ladyada </a>tested NewSoftSerial and made some improvements to the code, contributed a &#8220;goodnight moon&#8221; sketch, and tested the library (successfully) with the Atmega328p processor.  Thanks, ladyada!  Go buy a bunch of <a href="http://www.adafruit.com/index.php?main_page=product_info&#038;cPath=17&#038;products_id=123">processors</a> from her, please.  They give you twice the RAM and nearly twice the flash space.</p>
<p>I posted the <a href="/index.php/page_id=61/">new library</a>.</p>
<p><em>&#8230;<a href="http://en.wikipedia.org/wiki/Goodnight_Moon">goodnight moon</a>. goodnight cow jumping over the moon. goodnight light and the red balloon. goodnight bears. goodnight chairs&#8230;</em></p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/02/newsoftserial-6/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Introducing PStrings</title>
		<link>http://arduiniana.org/2009/02/pstring/</link>
		<comments>http://arduiniana.org/2009/02/pstring/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 18:27:40 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://sundial.org/arduino/?p=187</guid>
		<description><![CDATA[Check out the new PString library.
PString is a very lightweight string class that derives from Print, so you can use it to render text to string buffers the same way you would to the Serial port or to a LiquidCrystal device.  Try it out.  Feedback welcome.
Mikal
]]></description>
			<content:encoded><![CDATA[<p>Check out the new <a href="/libraries/pstring/">PString library</a>.</p>
<p>PString is a very lightweight string class that derives from Print, so you can use it to render text to string buffers the same way you would to the Serial port or to a LiquidCrystal device.  Try it out.  Feedback welcome.</p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/02/pstring/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>NewSoftSerial 5</title>
		<link>http://arduiniana.org/2009/02/newsoftserial-5/</link>
		<comments>http://arduiniana.org/2009/02/newsoftserial-5/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 04:07:03 +0000</pubDate>
		<dc:creator>Mikal</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino libraries]]></category>

		<guid isPermaLink="false">http://sundial.org/arduino/?p=137</guid>
		<description><![CDATA[NewSoftSerial version 5 is available. A lot of people have been using this library &#8212; thanks! &#8212; but I really need to recognize the exceptional work of two contributors.
First of all, the diligent analysis of forum user etracer yielded the root cause of a tricky problem with NSS on OSX. An avr-gcc 4.3.0 bug causes [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/libraries/NewSoftSerial/">NewSoftSerial version 5</a> is available. A lot of people have been using this library &#8212; thanks! &#8212; but I really need to recognize the exceptional work of two contributors.</p>
<p>First of all, the diligent analysis of forum user <strong>etracer</strong> yielded the root cause of a tricky problem with NSS on OSX. An avr-gcc 4.3.0 bug causes to compiler to fail to generate the proper entry and exit sequences for certain interrupt handlers. etracer identified the problem and provided an inline workaround. Thanks! etracer&#8217;s fix is in NSS 5.</p>
<p>Secondly, user <strong>jin</strong> contributed a large body of work based on NSS and identified a potential problem that could result in data loss (fixed in NSS 5). jin made a variant of NSS that supports 4-pin serial, with the additional pins providing a very nice RTS/CTS flow control. We may see this in NSS in the near future. Please comment. Is this an interesting feature?</p>
<p>Thanks for all the feedback.</p>
<p>Mikal</p>
]]></content:encoded>
			<wfw:commentRss>http://arduiniana.org/2009/02/newsoftserial-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
