cliechti | 86844e8 | 2009-08-12 00:05:33 +0000 | [diff] [blame] | 1 | .. _examples: |
| 2 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 3 | ========== |
| 4 | Examples |
| 5 | ========== |
| 6 | |
cliechti | 86844e8 | 2009-08-12 00:05:33 +0000 | [diff] [blame] | 7 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 8 | Miniterm |
| 9 | ======== |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 10 | Miniterm is now available as module instead of example. |
| 11 | see :ref:`miniterm` for details. |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 12 | |
| 13 | miniterm.py_ |
| 14 | The miniterm program. |
| 15 | |
| 16 | setup-miniterm-py2exe.py_ |
| 17 | This is a py2exe setup script for Windows. It can be used to create a |
| 18 | standalone ``miniterm.exe``. |
| 19 | |
Chris Liechti | 90570b9 | 2015-08-04 03:32:02 +0200 | [diff] [blame] | 20 | .. _miniterm.py: https://github.com/pyserial/pyserial/blob/master/serial/tools/miniterm.py |
| 21 | .. _setup-miniterm-py2exe.py: https://github.com/pyserial/pyserial/blob/master/examples/setup-miniterm-py2exe.py |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 22 | |
| 23 | |
| 24 | TCP/IP - serial bridge |
| 25 | ====================== |
| 26 | This program opens a TCP/IP port. When a connection is made to that port (e.g. |
| 27 | with telnet) it forwards all data to the serial port and vice versa. |
| 28 | |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 29 | This example only exports a raw socket connection. The next example |
| 30 | below gives the client much more control over the remote serial port. |
cliechti | dec243b | 2009-08-04 02:24:03 +0000 | [diff] [blame] | 31 | |
| 32 | - The serial port settings are set on the command line when starting the |
| 33 | program. |
| 34 | - There is no possibility to change settings from remote. |
| 35 | - All data is passed through as-is. |
| 36 | |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 37 | :: |
| 38 | |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 39 | usage: tcp_serial_redirect.py [-h] [-q] [--parity {N,E,O,S,M}] [--rtscts] |
| 40 | [--xonxoff] [--rts RTS] [--dtr DTR] |
| 41 | [-P LOCALPORT] |
| 42 | SERIALPORT [BAUDRATE] |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 43 | |
| 44 | Simple Serial to Network (TCP/IP) redirector. |
| 45 | |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 46 | positional arguments: |
| 47 | SERIALPORT serial port name |
| 48 | BAUDRATE set baud rate, default: 9600 |
| 49 | |
| 50 | optional arguments: |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 51 | -h, --help show this help message and exit |
| 52 | -q, --quiet suppress non error messages |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 53 | |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 54 | serial port: |
| 55 | --parity {N,E,O,S,M} set parity, one of {N E O S M}, default: N |
| 56 | --rtscts enable RTS/CTS flow control (default off) |
| 57 | --xonxoff enable software flow control (default off) |
| 58 | --rts RTS set initial RTS line state (possible values: 0, 1) |
| 59 | --dtr DTR set initial DTR line state (possible values: 0, 1) |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 60 | |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 61 | network settings: |
| 62 | -P LOCALPORT, --localport LOCALPORT |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 63 | local TCP port |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 64 | |
| 65 | NOTE: no security measures are implemented. Anyone can remotely connect to |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 66 | this service over the network. Only one connection at once is supported. When |
cliechti | 5134aab | 2009-07-21 19:47:59 +0000 | [diff] [blame] | 67 | the connection is terminated it waits for the next connect. |
| 68 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 69 | |
| 70 | tcp_serial_redirect.py_ |
| 71 | Main program. |
| 72 | |
Chris Liechti | 90570b9 | 2015-08-04 03:32:02 +0200 | [diff] [blame] | 73 | .. _tcp_serial_redirect.py: https://github.com/pyserial/pyserial/blob/master/examples/tcp_serial_redirect.py |
cliechti | 4cb9466 | 2013-10-17 03:17:50 +0000 | [diff] [blame] | 74 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 75 | |
cliechti | a2d8f96 | 2009-08-10 23:59:27 +0000 | [diff] [blame] | 76 | Single-port TCP/IP - serial bridge (RFC 2217) |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 77 | ============================================= |
| 78 | Simple cross platform :rfc:`2217` serial port server. It uses threads and is |
| 79 | portable (runs on POSIX, Windows, etc). |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 80 | |
cliechti | a2d8f96 | 2009-08-10 23:59:27 +0000 | [diff] [blame] | 81 | - The port settings and control lines (RTS/DTR) can be changed at any time |
| 82 | using :rfc:`2217` requests. The status lines (DSR/CTS/RI/CD) are polled every |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 83 | second and notifications are sent to the client. |
| 84 | - Telnet character IAC (0xff) needs to be doubled in data stream. IAC followed |
| 85 | by an other value is interpreted as Telnet command sequence. |
| 86 | - Telnet negotiation commands are sent when connecting to the server. |
| 87 | - RTS/DTR are activated on client connect and deactivated on disconnect. |
| 88 | - Default port settings are set again when client disconnects. |
cliechti | a2d8f96 | 2009-08-10 23:59:27 +0000 | [diff] [blame] | 89 | |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 90 | :: |
| 91 | |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 92 | usage: rfc2217_server.py [-h] [-p TCPPORT] [-v] SERIALPORT |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 93 | |
| 94 | RFC 2217 Serial to Network (TCP/IP) redirector. |
| 95 | |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 96 | positional arguments: |
| 97 | SERIALPORT |
| 98 | |
| 99 | optional arguments: |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 100 | -h, --help show this help message and exit |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 101 | -p TCPPORT, --localport TCPPORT |
| 102 | local TCP port, default: 2217 |
| 103 | -v, --verbose print more diagnostic messages (option can be given |
| 104 | multiple times) |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 105 | |
| 106 | NOTE: no security measures are implemented. Anyone can remotely connect to |
Chris Liechti | 7f59302 | 2015-09-07 21:04:39 +0200 | [diff] [blame] | 107 | this service over the network. Only one connection at once is supported. When |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 108 | the connection is terminated it waits for the next connect. |
| 109 | |
| 110 | .. versionadded:: 2.5 |
| 111 | |
| 112 | rfc2217_server.py_ |
| 113 | Main program. |
| 114 | |
| 115 | setup-rfc2217_server-py2exe.py_ |
| 116 | This is a py2exe setup script for Windows. It can be used to create a |
| 117 | standalone ``rfc2217_server.exe``. |
| 118 | |
Chris Liechti | 90570b9 | 2015-08-04 03:32:02 +0200 | [diff] [blame] | 119 | .. _rfc2217_server.py: https://github.com/pyserial/pyserial/blob/master/examples/rfc2217_server.py |
| 120 | .. _setup-rfc2217_server-py2exe.py: https://github.com/pyserial/pyserial/blob/master/examples/setup-rfc2217_server-py2exe.py |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 121 | |
| 122 | |
| 123 | Multi-port TCP/IP - serial bridge (RFC 2217) |
| 124 | ============================================ |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 125 | This example implements a TCP/IP to serial port service that works with |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 126 | multiple ports at once. It uses select, no threads, for the serial ports and |
| 127 | the network sockets and therefore runs on POSIX systems only. |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 128 | |
cliechti | 7aed833 | 2009-08-05 14:19:31 +0000 | [diff] [blame] | 129 | - Full control over the serial port with :rfc:`2217`. |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 130 | - Check existence of ``/tty/USB0...8``. This is done every 5 seconds using |
cliechti | 7aed833 | 2009-08-05 14:19:31 +0000 | [diff] [blame] | 131 | ``os.path.exists``. |
| 132 | - Send zeroconf announcements when port appears or disappears (uses |
| 133 | python-avahi and dbus). Service name: ``_serial_port._tcp``. |
| 134 | - Each serial port becomes available as one TCP/IP server. e.g. |
| 135 | ``/dev/ttyUSB0`` is reachable at ``<host>:7000``. |
| 136 | - Single process for all ports and sockets (not per port). |
| 137 | - The script can be started as daemon. |
| 138 | - Logging to stdout or when run as daemon to syslog. |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 139 | - Default port settings are set again when client disconnects. |
cliechti | 7cb78e8 | 2009-08-05 15:47:57 +0000 | [diff] [blame] | 140 | - modem status lines (CTS/DSR/RI/CD) are not polled periodically and the server |
| 141 | therefore does not send NOTIFY_MODEMSTATE on its own. However it responds to |
| 142 | request from the client (i.e. use the ``poll_modem`` option in the URL when |
| 143 | using a pySerial client.) |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 144 | |
Chris Liechti | a4cde70 | 2015-09-08 01:11:52 +0200 | [diff] [blame] | 145 | :: |
| 146 | |
| 147 | usage: port_publisher.py [options] |
| 148 | |
| 149 | Announce the existence of devices using zeroconf and provide |
| 150 | a TCP/IP <-> serial port gateway (implements RFC 2217). |
| 151 | |
| 152 | If running as daemon, write to syslog. Otherwise write to stdout. |
| 153 | |
| 154 | optional arguments: |
| 155 | -h, --help show this help message and exit |
| 156 | |
| 157 | serial port settings: |
| 158 | --ports-regex REGEX specify a regex to search against the serial devices |
| 159 | and their descriptions (default: /dev/ttyUSB[0-9]+) |
| 160 | |
| 161 | network settings: |
| 162 | --tcp-port PORT specify lowest TCP port number (default: 7000) |
| 163 | |
| 164 | daemon: |
| 165 | -d, --daemon start as daemon |
| 166 | --pidfile FILE specify a name for the PID file |
| 167 | |
| 168 | diagnostics: |
| 169 | -o FILE, --logfile FILE |
| 170 | write messages file instead of stdout |
| 171 | -q, --quiet suppress most diagnostic messages |
| 172 | -v, --verbose increase diagnostic messages |
| 173 | |
| 174 | NOTE: no security measures are implemented. Anyone can remotely connect to |
| 175 | this service over the network. Only one connection at once, per port, is |
| 176 | supported. When the connection is terminated, it waits for the next connect. |
| 177 | |
cliechti | 7aed833 | 2009-08-05 14:19:31 +0000 | [diff] [blame] | 178 | Requirements: |
| 179 | |
| 180 | - Python (>= 2.4) |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 181 | - python-avahi |
| 182 | - python-dbus |
cliechti | 7aed833 | 2009-08-05 14:19:31 +0000 | [diff] [blame] | 183 | - python-serial (>= 2.5) |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 184 | |
cliechti | 7aed833 | 2009-08-05 14:19:31 +0000 | [diff] [blame] | 185 | Installation as daemon: |
| 186 | |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 187 | - Copy the script ``port_publisher.py`` to ``/usr/local/bin``. |
| 188 | - Copy the script ``port_publisher.sh`` to ``/etc/init.d``. |
| 189 | - Add links to the runlevels using ``update-rc.d port_publisher.sh defaults 99`` |
| 190 | - Thats it :-) the service will be started on next reboot. Alternatively run |
| 191 | ``invoke-rc.d port_publisher.sh start`` as root. |
| 192 | |
cliechti | 7aed833 | 2009-08-05 14:19:31 +0000 | [diff] [blame] | 193 | .. versionadded:: 2.5 new example |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 194 | |
| 195 | port_publisher.py_ |
cliechti | 7aed833 | 2009-08-05 14:19:31 +0000 | [diff] [blame] | 196 | Multi-port TCP/IP-serial converter (RFC 2217) for POSIX environments. |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 197 | |
| 198 | port_publisher.sh_ |
| 199 | Example init.d script. |
| 200 | |
Chris Liechti | 90570b9 | 2015-08-04 03:32:02 +0200 | [diff] [blame] | 201 | .. _port_publisher.py: https://github.com/pyserial/pyserial/blob/master/examples/port_publisher.py |
| 202 | .. _port_publisher.sh: https://github.com/pyserial/pyserial/blob/master/examples/http://sourceforge.net/p/pyserial/code/HEAD/tree/trunk/pyserial/examples/port_publisher.sh |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 203 | |
| 204 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 205 | wxPython examples |
| 206 | ================= |
| 207 | A simple terminal application for wxPython and a flexible serial port |
| 208 | configuration dialog are shown here. |
| 209 | |
| 210 | wxTerminal.py_ |
| 211 | A simple terminal application. Note that the length of the buffer is |
| 212 | limited by wx and it may suddenly stop displaying new input. |
| 213 | |
| 214 | wxTerminal.wxg_ |
| 215 | A wxGlade design file for the terminal application. |
| 216 | |
| 217 | wxSerialConfigDialog.py_ |
| 218 | A flexible serial port configuration dialog. |
| 219 | |
| 220 | wxSerialConfigDialog.wxg_ |
| 221 | The wxGlade design file for the configuration dialog. |
| 222 | |
cliechti | 3453f12 | 2009-08-10 22:56:34 +0000 | [diff] [blame] | 223 | setup-wxTerminal-py2exe.py_ |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 224 | A py2exe setup script to package the terminal application. |
| 225 | |
Chris Liechti | 90570b9 | 2015-08-04 03:32:02 +0200 | [diff] [blame] | 226 | .. _wxTerminal.py: https://github.com/pyserial/pyserial/blob/master/examples/wxTerminal.py |
| 227 | .. _wxTerminal.wxg: https://github.com/pyserial/pyserial/blob/master/examples/wxTerminal.wxg |
| 228 | .. _wxSerialConfigDialog.py: https://github.com/pyserial/pyserial/blob/master/examples/wxSerialConfigDialog.py |
| 229 | .. _wxSerialConfigDialog.wxg: https://github.com/pyserial/pyserial/blob/master/examples/wxSerialConfigDialog.wxg |
| 230 | .. _setup-wxTerminal-py2exe.py: https://github.com/pyserial/pyserial/blob/master/examples/setup-wxTerminal-py2exe.py |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 231 | |
| 232 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 233 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 234 | Unit tests |
| 235 | ========== |
| 236 | The project uses a number of unit test to verify the functionality. They all |
cliechti | 88c4684 | 2009-08-10 22:29:54 +0000 | [diff] [blame] | 237 | need a loop back connector. The scripts itself contain more information. All |
| 238 | test scripts are contained in the directory ``test``. |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 239 | |
cliechti | 8611bf4 | 2009-08-03 00:34:03 +0000 | [diff] [blame] | 240 | The unit tests are performed on port ``0`` unless a different device name or |
cliechti | 88c4684 | 2009-08-10 22:29:54 +0000 | [diff] [blame] | 241 | ``rfc2217://`` URL is given on the command line (argv[1]). |
| 242 | |
| 243 | run_all_tests.py_ |
| 244 | Collect all tests from all ``test*`` files and run them. By default, the |
| 245 | ``loop://`` device is used. |
cliechti | 8611bf4 | 2009-08-03 00:34:03 +0000 | [diff] [blame] | 246 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 247 | test.py_ |
cliechti | 88c4684 | 2009-08-10 22:29:54 +0000 | [diff] [blame] | 248 | Basic tests (binary capabilities, timeout, control lines). |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 249 | |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 250 | test_advanced.py_ |
cliechti | 88c4684 | 2009-08-10 22:29:54 +0000 | [diff] [blame] | 251 | Test more advanced features (properties). |
cliechti | 86e8787 | 2009-07-21 13:32:45 +0000 | [diff] [blame] | 252 | |
cliechti | bb5c3c5 | 2009-07-23 02:29:27 +0000 | [diff] [blame] | 253 | test_high_load.py_ |
| 254 | Tests involving sending a lot of data. |
| 255 | |
cliechti | 25375b5 | 2010-07-21 23:27:13 +0000 | [diff] [blame] | 256 | test_readline.py_ |
| 257 | Tests involving readline. |
| 258 | |
cliechti | daf47ba | 2009-07-28 01:28:16 +0000 | [diff] [blame] | 259 | test_iolib.py_ |
| 260 | Tests involving the :mod:`io` library. Only available for Python 2.6 and |
| 261 | newer. |
| 262 | |
cliechti | 4a63d6b | 2011-03-19 02:57:51 +0000 | [diff] [blame] | 263 | test_url.py_ |
| 264 | Tests involving the :ref:`URL <URLs>` feature. |
| 265 | |
Chris Liechti | 90570b9 | 2015-08-04 03:32:02 +0200 | [diff] [blame] | 266 | .. _run_all_tests.py: https://github.com/pyserial/pyserial/blob/master/test/run_all_tests.py |
| 267 | .. _test.py: https://github.com/pyserial/pyserial/blob/master/test/test.py |
| 268 | .. _test_advanced.py: https://github.com/pyserial/pyserial/blob/master/test/test_advanced.py |
| 269 | .. _test_high_load.py: https://github.com/pyserial/pyserial/blob/master/test/test_high_load.py |
| 270 | .. _test_readline.py: https://github.com/pyserial/pyserial/blob/master/test/test_readline.py |
| 271 | .. _test_iolib.py: https://github.com/pyserial/pyserial/blob/master/test/test_iolib.py |
| 272 | .. _test_url.py: https://github.com/pyserial/pyserial/blob/master/test/test_url.py |