This repository has been archived on 2024-09-22. You can view files and clone it, but cannot push or open issues or pull requests.
pbi-ide/help/BasicStampHelp/Content/LanguageTopics/Commands/SEROUT.htm

1059 lines
58 KiB
HTML
Raw Normal View History

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" MadCap:lastBlockDepth="6" MadCap:lastHeight="94" MadCap:lastWidth="853" MadCap:disableMasterStylesheet="true" MadCap:tocPath="" MadCap:InPreviewMode="false" MadCap:PreloadImages="false" MadCap:RuntimeFileType="Topic" MadCap:TargetType="WebHelp" lang="en-us" xml:lang="en-us" MadCap:PathToHelpSystem="../../../" MadCap:HelpSystemFileName="Default.xml" MadCap:SearchType="Stem">
<head><title>SEROUT</title>
<link href="../../SkinSupport/MadCap.css" rel="stylesheet" />
<link href="../../Resources/Stylesheets/BSE_Help.css" rel="stylesheet" />
<script src="../../SkinSupport/MadCapAll.js" type="text/javascript">
</script>
</head>
<body>
<h1 class="code">SEROUT</h1>
<div class="ImagePlusCaption">
<div class="Col2">
<p>
<img src="../../graphics/pgm_icon1.gif" border="0" alt="BS1 icon" title="BS1 icon" />
<img src="../../graphics/pgm_icon2.gif" border="0" alt="BS2 icon" title="BS2 icon" />
<img src="../../graphics/pgm_icon2e.gif" border="0" alt="BS2e icon" title="BS2e icon" />
<img src="../../graphics/pgm_icon2sx.gif" border="0" alt="BS2sx icon" title="BS2sx icon" />
<img src="../../graphics/pgm_icon2p.gif" border="0" alt="BS2p icon" title="BS2p icon" />
<img src="../../graphics/pgm_icon2pe.gif" border="0" alt="BS2pe icon" title="BS2pe icon" />
<img src="../../graphics/pgm_icon2px.gif" border="0" alt="BS2px icon" title="BS2px icon" />
</p>
</div>
<p style="text-align: right;"><a href="../ExampleTopics/SeroutEx.htm" target="" title="" alt="" class="MCXref_0">SEROUT Examples</a>
</p>
<p>&#160;</p>
</div>
<p class="clear">&#160;</p>
<p>&#160;</p>
<p class="PlainText">Syntax <img align="absmiddle" src="../../graphics/mini_1.gif" /> : <span class="keyword_in_text">SEROUT</span><i>Tpin</i>,<i> Baudmode</i>, ({<i>#</i>}<i> OutputData</i>)<br />Syntax <img align="absmiddle" src="../../graphics/mini_2.gif" /> : <span class="keyword_in_text">SEROUT</span><i>Tpin </i>{\<i>Fpin</i>},<i> Baudmode</i>, {<i>Pace</i>,} {<i>Timeout</i>,<i> Tlabel</i>,} [<i>OutputData</i>]</p>
<h2>Function</h2>
<p class="PlainText">Transmit asynchronous serial data (e.g., RS-232 data).
</p>
<ul>
<li value="1"><b><i>Tpin</i></b> is a variable/constant/expression* (0 - 16) that specifies
the I/O pin through which the serial data will be transmitted. This pin will
be set to output mode. On the BS2, BS2e, BS2sx, BS2p, BS2pe, and BS2px, if
<i>Tpin</i> is set to 16, the BASIC Stamp uses the dedicated serial-output
pin (SOUT, physical pin 1), which is normally used by the Stamp Editor during
the download process.</li>
<li value="2"><b><i>Fpin</i></b> is an optional variable/constant/expression* (0 - 15) that
specifies the I/O pin to monitor for flow control status. This pin will be set
to input mode. NOTE: <i>Fpin</i> must be specified to use the optional
<i>Timeout</i> and <i>Tlabel</i> arguments in the <span class="keyword_in_text">SEROUT</span> command.</li>
<li value="3"><b><i>Baudmode</i></b> is variable/constant/expression* (0 - 7 on the BS1,
0 - 65535 on all other BASIC Stamp models) that specifies serial timing and
configuration.</li>
<li value="4"><b><i>Pace</i></b> is an optional variable/constant/expression (0 - 65535)
that determines the length of the pause between transmitted bytes. NOTE:
<i>Pace</i> cannot be used simultaneously with <i>Timeout</i>.</li>
<li value="5"><b><i>Timeout</i></b> is an optional variable/constant/expression* (0 - 65535)
that tells <span class="keyword_in_text">SEROUT</span> how long to wait for <i>Fpin</i> permission to send.
If permission does not arrive in time, the program will jump to the address
specified by <i>Tlabel</i>. NOTE: <i>Fpin</i> must be specified to use the
optional <i>Timeout</i> and <i>Tlabel</i> arguments in the <span class="keyword_in_text">SEROUT</span>
command.</li>
<li value="6"><b><i>Tlabel</i></b> is an optional label that must be provided along with
<i>Timeout</i>. <i>Tlabel</i> indicates where the program should go in the event
that permission to send data is not granted within the period specified by
<i>Timeout</i>.</li>
<li value="7"><b><i>OutputData</i></b>‡ is a list of variables, constants, expressions
and formatters that tells <span class="keyword_in_text">SEROUT</span> how to format outgoing data. <span class="keyword_in_text">SEROUT</span>can transmit individual or repeating bytes, convert values into decimal, hex
or binary text representations, or transmit strings of bytes from variable
arrays. These actions can be combined in any order in the <i>OutputData</i> list.</li>
</ul>
<p class="PlainText">*<img src="../../graphics/bs1note.gif" style="vertical-align: super;" /> Note: expressions are not allowed as arguments on the BS1. The range
of the <i>Pin</i> argument on the BS1 is 07.</p>
<p class="PlainText">‡Note: The BS1's <i>OutputData</i> argument can only be a list of variables and the optional decimal modifier (#).</p>
<h2>Quick Facts</h2>
<table width="100%" cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF">
<td width="22%" align="center">&#160;</td>
<td width="13%" align="center">BS1</td>
<td width="13%" align="center">BS2 and BS2e</td>
<td width="13%" align="center">BS2sx</td>
<td width="13%" align="center">BS2p</td>
<td width="13%" align="center">BS2pe</td>
<td width="13%" align="center">BS2px</td>
</tr>
<tr>
<td align="center" bgcolor="#CFCFCF">Units in <i>Pace</i></td>
<td align="center">N/A</td>
<td align="center">1 ms</td>
<td align="center">1 ms</td>
<td align="center">1 ms</td>
<td align="center">1 ms</td>
<td align="center">1 ms</td>
</tr>
<tr>
<td align="center" bgcolor="#CFCFCF">Units in <i>Timeout</i></td>
<td align="center">N/A</td>
<td align="center">1 ms</td>
<td align="center">0.4 ms</td>
<td align="center">0.4 ms</td>
<td align="center">1 ms</td>
<td align="center">0.4 ms</td>
</tr>
<tr>
<td align="center" bgcolor="#CFCFCF">Baud Range</td>
<td align="center">300, 600, 1200, and 2400 only</td>
<td align="center">243 to 50K</td>
<td align="center">608 to 115.2K</td>
<td align="center">608 to 115.2K</td>
<td align="center">243 to 50K</td>
<td align="center">972 to 115.2K</td>
</tr>
<tr>
<td align="center" bgcolor="#CFCFCF">Baud Limit with Flow Control</td>
<td align="center">N/A</td>
<td align="center">19.2K</td>
<td align="center">19.2K</td>
<td align="center">19.2K</td>
<td align="center">19.2K</td>
<td align="center">19.2K</td>
</tr>
<tr>
<td align="center" bgcolor="#CFCFCF">I/O Pins Available</td>
<td align="center">0 - 7</td>
<td align="center">0 - 15</td>
<td align="center">0 - 15</td>
<td align="center">0 - 15<br></br>(in current I/O block)</td>
<td align="center">0 - 15<br></br>(in current I/O block)</td>
<td align="center">0 - 15<br></br>(in current I/O block)</td>
</tr>
<tr>
<td align="center" bgcolor="#CFCFCF">Other Serial Port Pins</td>
<td align="center">N/A</td>
<td align="center" colspan="5">SOUT pin (physical pin 2) when <i>Tpin</i>= 16</td>
</tr>
<tr>
<td align="center" bgcolor="#CFCFCF">Related Commands</td>
<td align="center" colspan="1">
<p colspan="" align="center"><a href="SERIN.htm" target="" title="" alt="" class="MCXref_0">SERIN</a>
</p>
</td>
<td align="center" colspan="5">
<p colspan="5" align="center"><a href="SERIN.htm" target="" title="" alt="" class="MCXref_0">SERIN</a>, <a href="DEBUG.htm" target="" title="" alt="" class="MCXref_0">DEBUG</a></p>
</td>
</tr>
</table>
<h2>Explanation</h2>
<p class="PlainText">One of the most popular forms of communication between electronic devices is serial
communication. There are two major types of serial communication; asynchronous and
synchronous. The <span class="keyword_in_text">SERIN</span> and <span class="keyword_in_text">SEROUT</span> commands are used to receive and
send asynchronous serial data. See the <a href="SHIFTIN.htm" target="" title="" alt="" class="MCXref_0">SHIFTIN</a> and
<a href="SHIFTOUT.htm" target="" title="" alt="" class="MCXref_0">SHIFTOUT</a> commands for information on the synchronous
method.</p>
<p class="Tip" MadCap:autonum="Tip: &#160;"><span class="autonumber"><span class="TipSpan">Tip: &#160;</span></span><b>Don't let your BASIC Stamp be mistaken for a mouse! </b>
<br />
<br />Connecting USB-based boards to your PC may cause the BASIC Stamp to reset. If your BASIC Stamp program immediately starts sending serial data to the computer via a <span class="keyword_in_text">DEBUG</span> or <span class="keyword_in_text">SEROUT</span> command, your computer's operating system may mistake it for a mouse or other serial plug-and-play device. To avoid this, place a 1-second pause at the beginning of the program. </p>
<p class="PlainText">The following information is supplemental to what is discussed in the
<span class="keyword_in_text">SERIN</span> command section. Please read through the <span class="keyword_in_text">SERIN</span> command
section for additional information. </p>
<p>
<img src="../../graphics/bs2all_inline.gif" border="0">
</img>
</p>
<p class="PlainText">All BASIC Stamp models (except the BS1) have a line driver on its SOUT pin (Tpin =
16).
The SOUT pin goes to a PC's serial data-in pin on the DB-9 connector built into
BASIC Stamp development boards. The connector is wired to allow both programming
and run-time serial communication (unless you are using the Stamp 2 Carrier Board
which is only designed for programming). For the built-in serial port set the
<i>Tpin</i> argument to 16 in the <span class="keyword_in_text">SEROUT</span> command.</p>
<p class="PlainText">All BASIC Stamp models (including the BS1) can also transmit RS-232 data through any
of their I/O pins (Tpin = 0 - 7 for BS1, Tpin = 0 - 15 on all other BASIC Stamp models).
The I/O pins only provide a 0 to +5 volt swing (outside of RS-232 specs) and may
need to be connected through a line driver for proper operation with all serial
ports. Most serial ports are able to recognize a 0 to +5 volt swing, however. See
the figure below sample wiring.</p>
<center>
<img src="../../graphics/serial_sch.gif" border="0">
</img>
</center>
<p class="PlainText">Note: The connections shown in red are normally not necessary. They indicate optional connections to defeat hardware handshaking requirements.<br /></p>
<p class="PlainText">Note: A line driver may have to be used between the I/O pin and the receiving serial port to ensure proper communication.</p>
<p>
<center>
<table cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF">
<td width="175">Function</td>
<td width="50" align="center">DB-9</td>
<td width="50" align="center">DB-25</td>
</tr>
<tr>
<td>Data Carrier Detect (DCD)</td>
<td align="center">1</td>
<td align="center">8</td>
</tr>
<tr>
<td>Receive Data (RD)</td>
<td align="center">2</td>
<td align="center">3</td>
</tr>
<tr>
<td>Transmit Data (TD)</td>
<td align="center">3</td>
<td align="center">2</td>
</tr>
<tr>
<td>Data Terminal Ready (DTR)</td>
<td align="center">4</td>
<td align="center">20</td>
</tr>
<tr>
<td>Signal Ground (SG)</td>
<td align="center">5</td>
<td align="center">7</td>
</tr>
<tr>
<td>Data Set Ready (DSR)</td>
<td align="center">6</td>
<td align="center">6</td>
</tr>
<tr>
<td>Request To Send (RTS)</td>
<td align="center">7</td>
<td align="center">4</td>
</tr>
<tr>
<td>Clear To Send (CTS)</td>
<td align="center">8</td>
<td align="center">5</td>
</tr>
</table>
</center>
</p>
<p>&#160;</p>
<p class="PlainText">The figure above shows the pinouts of the two styles of PC serial ports and how
to connect them to the BASIC Stamp's I/O pin. Though not normally needed, the
figure also shows loop back connections that defeat hardware handshaking used by
some PC software. Note that PC serial ports are always male connectors. The 25-pin
style of serial port (called a DB-25) looks similar to a printer (parallel) port
except that it is male, whereas a parallel port is female.</p>
<p class="PlainText">Asynchronous serial communication relies on precise timing. Both the sender and
receiver must be set for identical timing, usually expressed in bits per second
(bps) called baud. </p>
<p class="PlainText">On all BASIC Stamp models, <span class="keyword_in_text">SEROUT</span> requires a value called Baudmode that tells
it the important characteristics of the outgoing serial data; the bit period, number
of data and parity bits, and polarity.</p>
<p>
<img src="../../graphics/bs1_inline.gif" border="0">
</img>
</p>
<p class="PlainText">On the BS1, serial communication is limited to: no-parity, 8-data bits and 1-stop
bit at one of four different speeds: 300, 600, 1200 or 2400 baud. The table below
indicates the <i>Baudmode</i> value or symbols to use when selecting the desired
mode.</p>
<p>
<center>
<table cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF">
<td width="75" align="center" valign="top">Baudmode Value</td>
<td width="75" align="center" valign="top">Symbol</td>
<td width="75" align="center" valign="top">Baud Rate</td>
<td width="225" align="center" valign="top">Polarity</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">T2400</td>
<td align="center">2400</td>
<td align="center">TRUE (always driven)</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">T1200</td>
<td align="center">1200</td>
<td align="center">TRUE (always driven)</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">T600</td>
<td align="center">600</td>
<td align="center">TRUE (always driven)</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">T300</td>
<td align="center">300</td>
<td align="center">TRUE (always driven)</td>
</tr>
<tr>
<td align="center">4</td>
<td align="center">N2400</td>
<td align="center">2400</td>
<td align="center">INVERTED (always driven)</td>
</tr>
<tr>
<td align="center">5</td>
<td align="center">N1200</td>
<td align="center">1200</td>
<td align="center">INVERTED (always driven)</td>
</tr>
<tr>
<td align="center">6</td>
<td align="center">N600</td>
<td align="center">600</td>
<td align="center">INVERTED (always driven)</td>
</tr>
<tr>
<td align="center">7</td>
<td align="center">N300</td>
<td align="center">300</td>
<td align="center">INVERTED (always driven)</td>
</tr>
<tr>
<td align="center">8</td>
<td align="center">OT2400</td>
<td align="center">2400</td>
<td align="center">TRUE (open drain, driven high)</td>
</tr>
<tr>
<td align="center">9</td>
<td align="center">OT1200</td>
<td align="center">1200</td>
<td align="center">TRUE (open drain, driven high)</td>
</tr>
<tr>
<td align="center">10</td>
<td align="center">OT600</td>
<td align="center">600</td>
<td align="center">TRUE (open drain, driven high)</td>
</tr>
<tr>
<td align="center">11</td>
<td align="center">OT300</td>
<td align="center">300</td>
<td align="center">TRUE (open drain, driven high)</td>
</tr>
<tr>
<td align="center">12</td>
<td align="center">ON2400</td>
<td align="center">2400</td>
<td align="center">INVERTED (open source, driven low)</td>
</tr>
<tr>
<td align="center">13</td>
<td align="center">ON1200</td>
<td align="center">1200</td>
<td align="center">INVERTED (open source, driven low)</td>
</tr>
<tr>
<td align="center">14</td>
<td align="center">ON600</td>
<td align="center">600</td>
<td align="center">INVERTED (open source, driven low)</td>
</tr>
<tr>
<td align="center">15</td>
<td align="center">N300</td>
<td align="center">300</td>
<td align="center">INVERTED (open source, driven low)</td>
</tr>
</table>
</center>
</p>
<p>&#160;</p>
<p>
<img src="../../graphics/bs2all_inline.gif" border="0" />
</p>
<p class="PlainText">On the BS2, BS2e, BS2sx, BS2p, BS2pe, and BS2px, serial communication is very flexible.
The <i>Baudmode</i> argument for <span class="keyword_in_text">SEROUT</span> accepts a 16-bit value that determines
its characteristics: 1-stop bit, 8-data bits/no-parity or 7-data bits/even-parity
and virtually any speed from as low as 300 baud to greater than 100K baud (depending
on the BASIC Stamp). The information below shows how <i>Baudmode</i> is calculated
and show common baud modes for standard serial baud rates. </p>
<h3><i>Baudmode</i> Calculation:
</h3>
<ol>
<li value="1">Determine the bit period (bits 0 - 11)
<ul><li value="1">BS2, BS2e, and BS2pe = INT(1,000,000 ÷ baud rate) - 20</li><li value="2">BS2sx and BS2p = INT(2,500,000 ÷ baud rate) - 20</li><li value="3">BS2px = INT(4,000,000 ÷ baud rate) - 20<br /> Note: INT means 'Convert to integer.' -- drop the numbers to the right
of the decimal point.</li></ul></li>
<li value="2">Set data bits and parity (bit 13)
<ul><li value="1">8-bit / No Parity = 0 ($0000)</li><li value="2">7-bit / Even Parity = 8192 ($2000)</li></ul></li>
<li value="3">Select polarity bit (bit 14)
<ul><li value="1">True = 0 ($0000)</li><li value="2">Inverted = 16384 ($4000)</li></ul></li>
<li value="4">Select driven or open output (bit 15)
<ul><li value="1">Driven = 0 ($0000)</li><li value="2">Open = 32768 ($8000)</li></ul></li>
</ol>
<p class="PlainText">Common Baud Rates and Corresponding <i>Baudmode</i> Values</p>
<p class="PlainText">
<img src="../../graphics/bs2epe_inline.gif" border="0" /> BS2, BS2e, BS2pe</p>
<table width="100%" cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF">
<td width="20%" align="center" valign="top">Baud Rate</td>
<td width="20%" align="center" valign="top">8-bit<br></br>No Parity<br></br>INVERTED</td>
<td width="20%" align="center" valign="top">8-bit<br></br>No Parity<br></br>TRUE</td>
<td width="20%" align="center" valign="top">7-bit<br></br>Even Parity<br></br>INVERTED</td>
<td width="20%" align="center" valign="top">7-bit<br></br>Even Parity<br></br>TRUE</td>
</tr>
<tr>
<td align="center">300</td>
<td align="center">19697 ($4CF1)</td>
<td align="center">3313 ($0CF1)</td>
<td align="center">27889 ($6CF1)</td>
<td align="center">11505 ($2CF1)</td>
</tr>
<tr>
<td align="center">600</td>
<td align="center">18030 ($466E)</td>
<td align="center">1646 ($066E)</td>
<td align="center">26222 ($666E)</td>
<td align="center">9838 ($266E)</td>
</tr>
<tr>
<td align="center">1200</td>
<td align="center">17197 ($432D)</td>
<td align="center">813 ($032D)</td>
<td align="center">25389 ($632D)</td>
<td align="center">9005 ($232D)</td>
</tr>
<tr>
<td align="center">2400</td>
<td align="center">16780 ($418C)</td>
<td align="center">396 ($018C)</td>
<td align="center">24972 ($618C)</td>
<td align="center">8588 ($218C)</td>
</tr>
<tr>
<td align="center">4800 </td>
<td align="center">16572 ($40BC)</td>
<td align="center">188 ($00BC)</td>
<td align="center">24764 ($60BC)</td>
<td align="center">8380 ($20BC)</td>
</tr>
<tr>
<td align="center">9600</td>
<td align="center">16468 ($4054)</td>
<td align="center">84 ($0054)</td>
<td align="center">24660 ($6054)</td>
<td align="center">8276 ($2054)</td>
</tr>
</table>
<p>&#160;</p>
<p>&#160;</p>
<p class="PlainText">
<img src="../../graphics/bsxp_inline.gif" border="0">
</img> BS2sx, BS2p</p>
<table width="100%" cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF">
<td width="20%" align="center" valign="top">Baud Rate</td>
<td width="20%" align="center" valign="top">8-bit<br></br>No Parity<br></br>INVERTED</td>
<td width="20%" align="center" valign="top">8-bit<br></br>No Parity<br></br>TRUE</td>
<td width="20%" align="center" valign="top">7-bit<br></br>Even Parity<br></br>INVERTED</td>
<td width="20%" align="center" valign="top">7-bit<br></br>Even Parity<br></br>TRUE</td>
</tr>
<tr>
<td align="center">1200</td>
<td align="center">18447 ($480F)</td>
<td align="center">2063 ($080F)</td>
<td align="center">26639 ($680F)</td>
<td align="center">10255 ($280F)</td>
</tr>
<tr>
<td align="center">2400</td>
<td align="center">17405 ($43FD)</td>
<td align="center">1021 ($03FD)</td>
<td align="center">25597 ($63FD)</td>
<td align="center">9213 ($23FD)</td>
</tr>
<tr>
<td align="center">4800 </td>
<td align="center">16884 ($41F4)</td>
<td align="center">500 ($01F4)</td>
<td align="center">25076 ($61F4)</td>
<td align="center">8692 ($21F4)</td>
</tr>
<tr>
<td align="center">9600</td>
<td align="center">16624 ($40F0)</td>
<td align="center">240 ($00F0)</td>
<td align="center">24816 ($60F0)</td>
<td align="center">8432 ($20F0)</td>
</tr>
</table>
<p>&#160;</p>
<p>&#160;</p>
<p class="PlainText">
<img src="../../graphics/bs2px_inline.gif" border="0">
</img> BS2px</p>
<table width="100%" cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF">
<td width="20%" align="center" valign="top">Baud Rate</td>
<td width="20%" align="center" valign="top">8-bit<br></br>No Parity<br></br>INVERTED</td>
<td width="20%" align="center" valign="top">8-bit<br></br>No Parity<br></br>TRUE</td>
<td width="20%" align="center" valign="top">7-bit<br></br>Even Parity<br></br>INVERTED</td>
<td width="20%" align="center" valign="top">7-bit<br></br>Even Parity<br></br>TRUE</td>
</tr>
<tr>
<td align="center">1200</td>
<td align="center">19697 ($4CF1)</td>
<td align="center">3313 ($0CF1)</td>
<td align="center">27889 ($6CF1)</td>
<td align="center">11505 ($2CF1)</td>
</tr>
<tr>
<td align="center">2400</td>
<td align="center">18030 ($466E)</td>
<td align="center">1646 ($066E)</td>
<td align="center">26222 ($666E)</td>
<td align="center">9838 ($266E)</td>
</tr>
<tr>
<td align="center">4800 </td>
<td align="center">17197 ($432D)</td>
<td align="center">813 ($032D)</td>
<td align="center">25389 ($632D)</td>
<td align="center">9005 ($232D)</td>
</tr>
<tr>
<td align="center">9600</td>
<td align="center">16780 ($418C)</td>
<td align="center">396 ($018C)</td>
<td align="center">24972 ($618C)</td>
<td align="center">8588 ($218C)</td>
</tr>
</table>
<p>&#160;</p>
<p class="Tip" MadCap:autonum="Tip: &#160;"><span class="autonumber"><span class="TipSpan">Tip: &#160;</span></span> For "open" baudmodes used in networking, add 32768 ($8000) to the values from the tables above. If the dedicated serial port (<i>Tpin</i> = 16) is used the data is inverted and driven regardless of the <i>Baudmode</i> setting.</p>
<p class="PlainText">If you're communicating with existing software or hardware, its speed(s) and
mode(s) will determine your choice of baud rate and mode. See the <span class="keyword_in_text">SERIN</span>
command description for more information.</p>
<p class="PlainText">The example below will transmit a single byte through I/O pin 1 at 2400 baud,
8N1, inverted: </p>
<p>
<img src="../../graphics/bs1_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, N2400, (65)
</pre>
<p>
<img src="../../graphics/bs2epe_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, 16780, [65] ' baudmode set for BS2/e/pe
</pre>
<p>
<img src="../../graphics/bsxp_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, 17405, [65] ' baudmode set for BS2sx/p
</pre>
<p class="PlainText">Here, <span class="keyword_in_text">SEROUT</span> will transmit a byte equal to 65 (the ASCII value of the
character "A") through pin 1. If the BASIC Stamp were connected to a PC running
a terminal program (set to the same baud rate) the character "A" would appear on
the screen.</p>
<p class="PlainText">What if you really wanted the value 65 to appear on the screen? If you remember
from the discussion in the <span class="keyword_in_text">SERIN</span> command, "It is up to the receiving side
(in serial communication) to interpret the values..." In this case, the PC is
interpreting the byte-sized value to be the ASCII code for the character "A".
Unless you're also writing the software for the PC, you can't change how the PC
interprets the incoming serial data, so to solve this problem, the data needs
to be translated before it is sent.</p>
<p class="PlainText">The <span class="keyword_in_text">SEROUT</span> command provides a formatter, called the decimal formatter,
which will translate the value 65 to two ASCII codes for the characters "6" and
"5" and then transmit them. Look at the following code:</p>
<p>
<img src="../../graphics/bs1_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, N2400, (#65)
</pre>
<p>
<img src="../../graphics/bs2epe_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, 16780, [DEC 65]
</pre>
<p>
<img src="../../graphics/bsxp_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, 17405, [DEC 65]
</pre>
<p class="PlainText">Notice the decimal formatter in the <span class="keyword_in_text">SEROUT</span> command. It is the "#" (for
the BS1) or "DEC" (for the other BASIC Stamp models) that appears just to the left of
the number 65. This tells <span class="keyword_in_text">SEROUT</span> to convert the number into separate ASCII
characters which represent the value in decimal form. If the value 65 in the code
were changed to 123, the <span class="keyword_in_text">SEROUT</span> command would send three bytes (49, 50 and
51) corresponding to the characters "1", "2" and "3".</p>
<p class="PlainText">The BS2, BS2e, BS2sx, BS2p, BS2pev and BS2px have many more conversion formatters
available for the <span class="keyword_in_text">SEROUT</span> command. See below for more information.</p>
<p class="PlainText">The <span class="keyword_in_text">SEROUT</span> command sends quoted text exactly as it appears in the
<i>OutputData</i> list:</p>
<p>
<img src="../../graphics/bs1_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, N2400, ("HELLO", CR)
SEROUT 1, N2400, ("Num = ", #100)
</pre>
<p>
<img src="../../graphics/bs2epe_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, 16780, ["HELLO", CR]
SEROUT 1, 16780, ["Num = ", DEC 100]
</pre>
<p>
<img src="../../graphics/bsxp_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
SEROUT 1, 17405, ["HELLO", CR]
SEROUT 1, 17405, ["Num = ", DEC 100]
</pre>
<p class="PlainText">The above code will display "HELLO" on one line and "Num = 100" on the next
line. Notice that you can combine data to output in one <span class="keyword_in_text">SEROUT</span> command,
separated by commas. In the example above, we could have written it as one line
of code, with "HELLO", CR, "Num = ", DEC 100 in the <i>OutputData</i> list.</p>
<p>
<img src="../../graphics/bs1_inline.gif" border="0">
</img>
</p>
<p class="PlainText">The BS1's <span class="keyword_in_text">SEROUT</span> command is limited to above-mentioned features. If you
are not using a BS1, please continue reading about the additional features below.</p>
<p>
<img src="../../graphics/bsall_inline.gif" border="0">
</img>
</p>
<p class="PlainText">The <span class="keyword_in_text">SEROUT</span> command can also be configured to pause between transmitted
bytes. This is the purpose of the optional <i>Pace</i> argument. For example
(9600 baud N8, inverted): </p><pre class="BScode" xml:space="preserve">
SEROUT 1, 16468, 1000, ["Slowly"] ' baudmode set for BS2
</pre>
<p>Here, the BASIC Stamp transmits the word "Slowly" with a 1 second delay between
each character. See the table above for units of the <i>Pace</i> argument. One
good reason to use the Pace feature is to support devices that require more than
one stop bit. Normally, the BASIC Stamp sends data as fast as it can (with a
minimum of 1 stop bit between bytes). Since a stop bit is really just a resting
state in the line (no data transmitted), using the <i>Pace</i> option will
effectively add multiple stop bits. Since the requirement for 2 or more stop bits
(on some devices) is really just a "minimum" requirement, the receiving side should
receive this data correctly. </p>
<p class="PlainText">Keep in mind that when we type something like "XYZ" into the <span class="keyword_in_text">SEROUT</span>
command, the BASIC Stamp actually uses the ASCII codes for each of those characters
for its tasks. We could also typed: 88, 89, 90 in place of "XYZ" and the program
would run the same way since 88 is the ASCII code for the "X" character, 89 is the
ASCII code for the "Y" character, and so on. </p>
<p class="PlainText">The decimal formatter is only one of a whole family of conversion formatters
available with <span class="keyword_in_text">SEROUT</span> on the BS2, BS2e, BS2sx, BS2p, BS2pe, and BS2px. See
the table below for a list of available conversion formatters. All of the conversion
formatters work similar to the decimal formatter. The formatters translate the
value into separate bytes of data until the entire number is translated or until
the indicated number of digits (in the case of the fixed length formatters) is
translated. </p>
<p class="PlainText">
<img src="../../graphics/bs2all_inline.gif" border="0" />
<br />
</p>
<table width="100%" cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF" align="center" valign="top">
<td width="20%">Conversion Formatter</td>
<td width="70%">Type of Number</td>
<td width="10%">Notes</td>
</tr>
<tr align="center">
<td>DEC{1..5}</td>
<td align="left">Decimal, optionally fixed to 1 - 5 digits</td>
<td>1</td>
</tr>
<tr align="center">
<td>SDEC{1..5}</td>
<td align="left">Signed decimal, optionally fixed to 1 - 5 digits</td>
<td>1,2</td>
</tr>
<tr align="center">
<td>HEX{1..4}</td>
<td align="left">Hexadecimal, optionally fixed to 1 - 4 digits</td>
<td>1</td>
</tr>
<tr align="center">
<td>SHEX{1..4}</td>
<td align="left">Signed hexadecimal, optionally fixed to 1 - 4 digits </td>
<td>1,2</td>
</tr>
<tr align="center">
<td>IHEX{1..4}</td>
<td align="left">Indicated hexadecimal, optionally fixed to 1 - 4 digits</td>
<td>1</td>
</tr>
<tr align="center">
<td>ISHEX{1..4}</td>
<td align="left">Signed, indicated hexadecimal, optionally fixed to 1 - 4 digits ($ prefix)</td>
<td>1,2</td>
</tr>
<tr align="center">
<td>BIN{1..16}</td>
<td align="left">Binary, optionally fixed to1 - 16 digits</td>
<td>1</td>
</tr>
<tr align="center">
<td>SBIN{1..16}</td>
<td align="left">Signed binary, optionally fixed to 1 - 16 digits</td>
<td>1,2</td>
</tr>
<tr align="center">
<td>IBIN{1..16}</td>
<td align="left">Indicated binary, optionally fixed to 1 - 16 digits</td>
<td>1</td>
</tr>
<tr align="center">
<td>ISBIN{1..16}</td>
<td align="left">Signed, indicated binary, optionally fixed to 1 - 16 digits</td>
<td>1,2</td>
</tr>
</table>
<ol>
<li value="1">Fixed-digit formatters like DEC4 will pad the number with leading 0s if
necessary; ex: DEC4 65 sends 0065. If a number is larger than the specified
number of digits, the leading digits will be dropped; ex: DEC4 56422 sends
6422.</li>
<li value="2">Signed modifiers work under two's complement rules.</li>
</ol>
<p class="PlainText">The BS2, BS2e, BS2sx, BS2p, BS2pe, and BS2px also have special formatters for
outputting a string of characters, repeated characters and undesirable
characters.</p>
<p class="PlainText">
<img src="../../graphics/bs2all_inline.gif" border="0">
</img>
</p>
<table width="100%" cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF" align="center" valign="top">
<td width="20%">Special Formatter</td>
<td width="80%">Action</td>
</tr>
<tr>
<td align="center">?</td>
<td>Displays "symbol = x' + carriage return; where x is a number. Default
format is decimal, but may be combined with conversion formatters (ex: BIN
? x to display "x = binary_number").</td>
</tr>
<tr>
<td align="center">ASC ?</td>
<td>Displays "symbol = 'x'" + carriage return; where x is an ASCII character.</td>
</tr>
<tr>
<td align="center">STR ByteArray {\L}</td>
<td>Send character string from an array. The optional \L argument can be used
to limit the output to L characters, otherwise, characters will be sent up
to the first byte equal to 0 or the end of RAM space is reached.</td>
</tr>
<tr>
<td align="center">REP Byte\L</td>
<td>Send a string consisting of Byte repeated L times (ex: REP "X"\10 sends
"XXXXXXXXXX").</td>
</tr>
</table>
<p>&#160;</p>
<p class="PlainText">The string formatter is useful for transmitting a string of characters from a
byte array variable. A string of characters is a set of characters that are
arranged or accessed in a certain order. The characters "ABC" could be stored in
a string with the "A" first, followed by the "B" and then followed by the "C."
A byte array is a similar concept to a string; it contains data that is arranged
in a certain order. Each of the elements in an array is the same size. The string
"ABC" could be stored in a byte array containing three bytes (elements). </p>
<p class="PlainText">Here is an example that transmits five bytes (from a byte array) through I/O
pin 1 at 9600 bps, N81/inverted: </p>
<p>
<img src="../../graphics/bs2epe_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
serStr VAR Byte(5) ' Make a 5-byte array.
Main:
serStr(0) = "H"
serStr(1) = "E"
serStr(2) = "L"
serStr(3) = "L"
serStr(4) = "O"
SEROUT 1, 16468, [STR serStr\5] ' Send 5-byte string
</pre>
<p class="PlainText">Note that we use the optional \L argument of STR. If we didn't specify this,
the BASIC Stamp would try to keep sending characters until it found a byte equal
to 0. Since we didn't specify a last byte of 0 in the array, we chose to tell it
explicitly to only send 5 characters. </p>
<p class="PlainText">Parity is a simple error-checking feature. When the <span class="keyword_in_text">SEROUT</span> command's
<i>Baudmode</i> is set for even parity it counts the number of 1s in the outgoing
byte and uses the parity bit to make that number even. For instance, if it is
sending the 7-bit value: %0011010, it sets the parity bit to 1 in order to make
an even number of 1s (four). </p>
<p class="PlainText">The receiver also counts the data bits to calculate what the parity bit should
be. If it matches the parity bit received, the serial receiver assumes that the
data was received correctly. Of course, this is not necessarily true, since two
incorrectly received bits could make parity seem correct when the data was wrong,
or the parity bit itself could be bad when the rest of the data was OK. Parity
errors are only detected on the receiver side. Generally, the receiver determines
how to handle the error. In a more robust application, the receiver and transmitter
might be set up such that the receiver can request a re-send of data that was
received with a parity error.</p>
<p class="PlainText">When you design an application that requires serial communication between BASIC
Stamp modules, you have to work within these limitations: </p>
<ul>
<li value="1">When the BASIC Stamp is sending or receiving data, it can't execute other
instructions. </li>
<li value="2">When the BASIC Stamp is executing other instructions, it can't send or
receive data. The BASIC Stamp does not have a serial buffer as there is in
PCs. At most serial rates, the BASIC Stamp cannot receive data via <span class="keyword_in_text">SERIN</span>,
process it, and execute another <span class="keyword_in_text">SERIN</span> in time to catch the next chunk
of data, unless there are significant pauses between data transmissions.</li>
</ul>
<p class="PlainText">These limitations can sometimes be addressed by using flow control; the <i>Fpin</i>option for <span class="keyword_in_text">SERIN</span> and <span class="keyword_in_text">SEROUT</span> (at baud rates of up to the limitation
shown above). Through <i>Fpin</i>, <span class="keyword_in_text">SERIN</span> can tell a BASIC Stamp sender when
it is ready to receive data and <span class="keyword_in_text">SEROUT</span> (on the sender) will wait for
permission to send. (For that matter, <i>Fpin</i> flow control follows the rules
of other serial handshaking schemes, but most computers other than the BASIC Stamp
cannot start and stop serial transmission on a byte-by-byte basis. That's why this
discussion is limited to communication between BASIC Stamp modules.)</p>
<p class="PlainText">Here's an example using flow control on the BS2 (data through I/O pin 1, flow
control through I/O pin 0, 9600 baud, N8, non-inverted):</p>
<p>
<img src="../../graphics/bs2epe_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
sData VAR Byte
Main:
SEROUT 1\0, 84, [sData] ' baudmode set for BS2
</pre>
<p class="PlainText">When <span class="keyword_in_text">SEROUT</span> executes, I/O pin 1 (<i>Tpin</i>) is made an output, and
I/O pin 0 (<i>Fpin</i>) is made an input, to wait for the "go" signal from the
receiver. Here's the relationship of serial polarity to <i>Fpin</i> states. </p>
<p>
<center>
<table cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF" align="center" valign="top">
<td width="150">&#160;</td>
<td width="150">Ready to Receive<br></br>("Go")</td>
<td width="150">Not Ready to Receive<br></br>("Stop")</td>
</tr>
<tr align="center">
<td>Inverted</td>
<td><i>Fpin</i> is High (1)</td>
<td><i>Fpin</i> is Low (0)</td>
</tr>
<tr align="center">
<td>Non-Inverted</td>
<td><i>Fpin</i> is Low (0)</td>
<td><i>Fpin</i> is High (1)</td>
</tr>
</table>
</center>
</p>
<p>&#160;</p>
<p class="PlainText">See the <a href="../ExampleTopics/SeroutEx.htm" target="" title="" alt="" class="MCXref_0">SEROUT Examples</a> for a flow control example
using two BS2s. In the demo program example, without flow control, the sender would
transmit the whole word "HELLO!" in about 6 ms. The receiver would catch the first
byte at most; by the time it got back from the first 1-second <span class="keyword_in_text">PAUSE</span>, the
rest of the data would be long gone. With flow control, communication is flawless
since the sender waits for the receiver to catch up. </p>
<p class="PlainText">In the figure below, I/O pin 0, <i>Fpin</i>, is pulled to ground through a 10
kΩ resistor. This is to ensure that the sender sees a stop signal (0 for
inverted communications) when the receiver is being programmed.</p>
<center>
<img src="../../graphics/flow_ctrl_sch.gif" border="0">
</img>
</center>
<p>&#160;</p>
<p class="PlainText">In the flow control examples above, the only way the <span class="keyword_in_text">SEROUT</span> instruction
will end (other than RESET or power-off) is if the receiver allows it to send the
entire <i>OutputData</i> list. If <i>Fpin</i> permission never occurs, the program
is stuck. However, you can tell the BASIC Stamp to abort <span class="keyword_in_text">SEROUT</span> if it doesn't
receive <i>Fpin</i> permission within a specified time period. For instance, to
transmit a decimal number through pin 1 at 9600 baud, 8N, inverted and abort
<span class="keyword_in_text">SEROUT</span> after 2 seconds (2000 ms) if no <i>Fpin</i> permission arrives on
I/O pin 0: </p>
<p>
<img src="../../graphics/bs2epe_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
Main:
SEROUT 1\0, 16468, 2000, No_Permission, [DEC 150]
STOP
No_Permission:
DEBUG CLS, "Timed out"
STOP
</pre>
<p>If no <i>Fpin</i> permission arrives within 2 seconds, the program aborts
<span class="keyword_in_text">SEROUT</span> and continues at the label NoPermission.</p>
<p class="PlainText">The <span class="keyword_in_text">SEROUT</span> command supports open-drain and open-source output, which
makes it possible to network multiple BASIC Stamp modules on a single pair of wires. These
"open baudmodes" only actively drive the <i>Tpin</i> in one state (for the other
state, they simply disconnect the pin; setting it to an input mode). If two BASIC
Stamp modules in a network had their <span class="keyword_in_text">SEROUT</span> lines connected together (while a third
device listened on that line) and the BASIC Stamp modules were using always-driven
baudmodes, they could simultaneously output two opposite states (i.e., +5 volts and
ground). This would create a short circuit. The heavy current flow would likely
damage the I/O pins or the BASIC Stamp modules themselves. Since the open baudmodes only
drive in one state and float in the other, there's no chance of this kind of short.</p>
<p class="PlainText">The polarity selected for <span class="keyword_in_text">SEROUT</span> determines which state is driven and
which is open as shown below:</p>
<p>
<center>
<table cellpadding="4" cellspacing="0" border="1">
<tr bgcolor="#CFCFCF" align="center" valign="top">
<td width="125">&#160;</td>
<td width="100">State (0)</td>
<td width="100">State (1)</td>
<td width="100">Resistor pulled to...</td>
</tr>
<tr align="center">
<td>Inverted</td>
<td>Open</td>
<td>Driven</td>
<td>Gnd (Vss)</td>
</tr>
<tr align="center">
<td>Non-Inverted</td>
<td>Driven</td>
<td>Open</td>
<td>+5V (Vdd)</td>
</tr>
</table>
</center>
</p>
<p>&#160;</p>
<p class="PlainText">Since open baudmodes only drive to one state, they need a resistor to pull the
networked line into the other state, as shown in the table above and the figures
below.</p>
<p class="PlainText">Open baudmodes allow the BASIC Stamp to share a line, but it is up to your
program to resolve other networking issues such as who talks when and how to
detect, prevent and fix data errors.</p>
<p>
<center>
<table cellpadding="4" cellspacing="0" border="0">
<tr>
<td>SEROUT Open-Drain circuit:<br /></td>
</tr>
<tr>
<td>
<img src="../../graphics/serout_od.gif" border="0">
</img>
</td>
</tr>
</table>
</center>
</p>
<p>
<center>
<table cellpadding="4" cellspacing="0" border="0">
<tr>
<td><span class="keyword_in_text">SEROUT</span> Open-Source circuit:<br></br></td>
</tr>
<tr>
<td>
<img src="../../graphics/serout_os.gif" border="0">
</img>
</td>
</tr>
</table>
</center>
</p>
<h3>SEROUT Troubleshooting</h3>
<p class="PlainText">Serial communication, because of its complexity, can be very difficult to work
with at times. Please follow these guidelines when developing a project using the
<span class="keyword_in_text">SERIN</span> and <span class="keyword_in_text">SEROUT</span> commands:</p>
<ol>
<li value="1">Always build your project in steps.
<ol type="a"><li value="1">Start with small, manageable pieces of code, that deals with serial
communication) and test them, one at a time.</li><li value="2">Add more and more small pieces, testing them each time, as you go.</li><li value="3">Never write a large portion of code that works with serial communication
without testing its smallest workable pieces first.</li></ol></li>
<li value="2">Pay attention to timing.
<ol type="a"><li value="1">Be very careful to calculate and overestimate the amount of time
operations should take within the BASIC Stamp. Misunderstanding the timing
constraints is the source of most problems with code that communicate
serially.</li><li value="2">If the serial communication in your project is bidirectional, the above
statement is even more critical.</li></ol></li>
<li value="3">Pay attention to wiring.
<ol type="a"><li value="1">Take extra time to study and verify serial communication wiring diagrams.
A mistake in wiring can cause strange problems in communication, or no
communication at all. Make sure to connect the ground pins (Vss) between
the devices that are communicating serially.</li></ol></li>
<li value="4">Verify port setting on the PC and in the <span class="keyword_in_text">SERIN</span>/<span class="keyword_in_text">SEROUT</span> commands.
<ol type="a"><li value="1">Unmatched settings on the sender and receiver side will cause garbled
data transfers or no data transfers. If the data you receive is unreadable,
it is most likely a baud rate setting error.</li></ol></li>
<li value="5">If data transmitted to the Stamp Editor's Debug Terminal is garbled, verify
the output format.
<ol type="a"><li value="1">A common mistake is to send data with <span class="keyword_in_text">SEROUT</span> in ASCII format. For
example, <span class="keyword_in_text">SEROUT</span> 16, 84, [ 0 ] instead of <span class="keyword_in_text">SEROUT</span> 16, 84,
[ DEC 0 ]. The first example will send a byte equal to 0 to the PC,
resulting in the <span class="keyword_in_text">DEBUG</span> Terminal clearing the screen (since 0 is
the control character for a clear-screen action).</li></ol></li>
<li value="6">When using a BS2-family module, you can simplify <i>Baudmode</i> parameter
selection by using conditional compilation. The example below can be
included in the standard programming template and will handle most serial
IO requirements. Remember that defining constants does not affect compiled
program space, and yet does make program debugging easier.
</li>
</ol>
<p>
<img src="../../graphics/bs2all_inline.gif" border="0">
</img>
</p><pre class="BScode" xml:space="preserve">
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T1200 CON 813
T2400 CON 396
T4800 CON 188
T9600 CON 84
T19K2 CON 32
T38K4 CON 6
#CASE BS2SX, BS2P
T1200 CON 2063
T2400 CON 1021
T4800 CON 500
T9600 CON 240
T19K2 CON 110
T38K4 CON 45
#CASE BS2PX
T1200 CON 3313
T2400 CON 1646
T4800 CON 813
T9600 CON 396
T19K2 CON 188
T38K4 CON 84
#ENDSELECT
SevenBit CON $2000
Inverted CON $4000
Open CON $8000
Baud CON T9600 + Inverted ' match DEBUG
</pre>
<div class="Col2">
<div class="MasterFoot">
<p MadCap:conditions="BSEconditions.BSEWebHelp (Primary)-INCLUDE"><a href="../../HomeTopics/HomePage.htm">Go to Welcome page</a>
</p>
</div>
</div>
<div class="Col2">
<div class="MasterFoot">
<p style="text-align: right;"><span class="ContactInfoProjectName">BASIC Stamp Help</span> <![CDATA[ ]]><span class="ContactInfoVersion#">Version 2.5.4</span> <![CDATA[ ]]></p>
<p style="text-align: right;">Copyright ©&#160;<span class="ContactInfoCompanyName">Parallax Inc.</span></p>
<p style="text-align: right;"><span class="SystemShortDate">8/8/2012</span>
</p>
</div>
</div>
<script type="text/javascript">/* <![CDATA[ */
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-285614-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
/* ]]> */</script>
<script type="text/javascript" src="../../SkinSupport/MadCapBodyEnd.js">
</script>
</body>
</html>