Chris Liechti | d32faae | 2015-12-21 23:40:43 +0100 | [diff] [blame] | 1 | .. _URLs: |
| 2 | |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 3 | ============== |
| 4 | URL Handlers |
| 5 | ============== |
| 6 | |
| 7 | .. module:: serial |
| 8 | |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 9 | Overview |
| 10 | ======== |
| 11 | The function :func:`serial_for_url` accepts the following types of URLs: |
| 12 | |
| 13 | - ``rfc2217://<host>:<port>[?<option>[&<option>...]]`` |
| 14 | - ``socket://<host>:<port>[?logging={debug|info|warning|error}]`` |
| 15 | - ``loop://[?logging={debug|info|warning|error}]`` |
Chris Liechti | 147b08d | 2015-12-26 00:50:22 +0100 | [diff] [blame] | 16 | - ``hwgrep://<regexp>[&skip_busy][&n=N]`` |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 17 | - ``spy://port[?option[=value][&option[=value]]]`` |
Chris Liechti | 06ae1dc | 2016-05-05 23:54:35 +0200 | [diff] [blame] | 18 | - ``alt://port?class=<classname>`` |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 19 | |
| 20 | .. versionchanged:: 3.0 Options are specified with ``?`` and ``&`` instead of ``/`` |
| 21 | |
| 22 | Device names are also supported, e.g.: |
| 23 | |
| 24 | - ``/dev/ttyUSB0`` (Linux) |
| 25 | - ``COM3`` (Windows) |
| 26 | |
| 27 | Future releases of pySerial might add more types. Since pySerial 2.6 it is also |
| 28 | possible for the user to add protocol handlers using |
| 29 | :attr:`protocol_handler_packages`. |
| 30 | |
| 31 | |
| 32 | ``rfc2217://`` |
| 33 | ============== |
| 34 | Used to connect to :rfc:`2217` compatible servers. All serial port |
| 35 | functions are supported. Implemented by :class:`rfc2217.Serial`. |
| 36 | |
| 37 | Supported options in the URL are: |
| 38 | |
| 39 | - ``ign_set_control`` does not wait for acknowledges to SET_CONTROL. This |
| 40 | option can be used for non compliant servers (i.e. when getting an |
| 41 | ``remote rejected value for option 'control'`` error when connecting). |
| 42 | |
| 43 | - ``poll_modem``: The client issues NOTIFY_MODEMSTATE requests when status |
| 44 | lines are read (CTS/DTR/RI/CD). Without this option it relies on the server |
| 45 | sending the notifications automatically (that's what the RFC suggests and |
| 46 | most servers do). Enable this option when :attr:`cts` does not work as |
| 47 | expected, i.e. for servers that do not send notifications. |
| 48 | |
| 49 | - ``timeout=<value>``: Change network timeout (default 3 seconds). This is |
| 50 | useful when the server takes a little more time to send its answers. The |
| 51 | timeout applies to the initial Telnet / :rfc:`2271` negotiation as well |
| 52 | as changing port settings or control line change commands. |
| 53 | |
| 54 | - ``logging={debug|info|warning|error}``: Prints diagnostic messages (not |
| 55 | useful for end users). It uses the logging module and a logger called |
| 56 | ``pySerial.rfc2217`` so that the application can setup up logging |
| 57 | handlers etc. It will call :meth:`logging.basicConfig` which initializes |
| 58 | for output on ``sys.stderr`` (if no logging was set up already). |
| 59 | |
| 60 | .. warning:: The connection is not encrypted and no authentication is |
| 61 | supported! Only use it in trusted environments. |
| 62 | |
| 63 | |
| 64 | ``socket://`` |
| 65 | ============= |
| 66 | The purpose of this connection type is that applications using pySerial can |
| 67 | connect to TCP/IP to serial port converters that do not support :rfc:`2217`. |
| 68 | |
| 69 | Uses a TCP/IP socket. All serial port settings, control and status lines |
| 70 | are ignored. Only data is transmitted and received. |
| 71 | |
| 72 | Supported options in the URL are: |
| 73 | |
| 74 | - ``logging={debug|info|warning|error}``: Prints diagnostic messages (not |
| 75 | useful for end users). It uses the logging module and a logger called |
| 76 | ``pySerial.socket`` so that the application can setup up logging handlers |
| 77 | etc. It will call :meth:`logging.basicConfig` which initializes for |
| 78 | output on ``sys.stderr`` (if no logging was set up already). |
| 79 | |
| 80 | .. warning:: The connection is not encrypted and no authentication is |
| 81 | supported! Only use it in trusted environments. |
| 82 | |
| 83 | |
| 84 | ``loop://`` |
| 85 | =========== |
| 86 | The least useful type. It simulates a loop back connection |
| 87 | (``RX<->TX`` ``RTS<->CTS`` ``DTR<->DSR``). It could be used to test |
| 88 | applications or run the unit tests. |
| 89 | |
| 90 | Supported options in the URL are: |
| 91 | |
| 92 | - ``logging={debug|info|warning|error}``: Prints diagnostic messages (not |
| 93 | useful for end users). It uses the logging module and a logger called |
| 94 | ``pySerial.loop`` so that the application can setup up logging handlers |
| 95 | etc. It will call :meth:`logging.basicConfig` which initializes for |
| 96 | output on ``sys.stderr`` (if no logging was set up already). |
| 97 | |
| 98 | |
| 99 | ``hwgrep://`` |
| 100 | ============= |
| 101 | This type uses :mod:`serial.tools.list_ports` to obtain a list of ports and |
Chris Liechti | 147b08d | 2015-12-26 00:50:22 +0100 | [diff] [blame] | 102 | searches the list for matches by a regexp that follows the slashes (see Pythons |
| 103 | :py:mod:`re` module for detailed syntax information). |
| 104 | |
| 105 | Note that options are separated using the character ``&``, this also applies to |
| 106 | the first, where URLs usually use ``?``. This exception is made as the question |
| 107 | mark is used in regexp itself. |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 108 | |
Chris Liechti | 06ae1dc | 2016-05-05 23:54:35 +0200 | [diff] [blame] | 109 | Depending on the capabilities of the ``list_ports`` module on the system, it is |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 110 | possible to search for the description or hardware ID of a device, e.g. USB |
| 111 | VID:PID or texts. |
| 112 | |
Chris Liechti | 06ae1dc | 2016-05-05 23:54:35 +0200 | [diff] [blame] | 113 | Unfortunately, on some systems ``list_ports`` only lists a subset of the port |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 114 | names with no additional information. Currently, on Windows and Linux and |
| 115 | OSX it should find additional information. |
| 116 | |
Chris Liechti | 147b08d | 2015-12-26 00:50:22 +0100 | [diff] [blame] | 117 | Supported options in the URL are: |
| 118 | |
| 119 | - ``n=N``: pick the N'th entry instead of the first |
| 120 | - ``skip_busy``: skip ports that can not be opened, e.g. because they are |
| 121 | already in use. This may not work as expected on platforms where the file is |
| 122 | not locked automatically (e.g. Posix). |
| 123 | |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 124 | |
Chris Liechti | 961234d | 2016-09-18 23:54:49 +0200 | [diff] [blame] | 125 | .. _spy: |
| 126 | |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 127 | ``spy://`` |
| 128 | ========== |
| 129 | Wrapping the native serial port, this protocol makes it possible to |
| 130 | intercept the data received and transmitted as well as the access to the |
| 131 | control lines, break and flush commands. It is mainly used to debug |
| 132 | applications. |
| 133 | |
| 134 | Supported options in the URL are: |
| 135 | |
| 136 | - ``file=FILENAME`` output to given file or device instead of stderr |
| 137 | - ``color`` enable ANSI escape sequences to colorize output |
| 138 | - ``raw`` output the read and written data directly (default is to create a |
| 139 | hex dump). In this mode, no control line and other commands are logged. |
| 140 | - ``all`` also show ``in_waiting`` and empty ``read()`` calls (hidden by |
| 141 | default because of high traffic). |
| 142 | |
| 143 | Example:: |
| 144 | |
| 145 | import serial |
| 146 | |
| 147 | with serial.serial_for_url('spy:///dev/ttyUSB0?file=test.txt', timeout=1) as s: |
| 148 | s.dtr = False |
| 149 | s.write('hello world') |
| 150 | s.read(20) |
| 151 | s.dtr = True |
| 152 | s.write(serial.to_bytes(range(256))) |
| 153 | s.read(400) |
| 154 | s.send_break() |
| 155 | |
| 156 | with open('test.txt') as f: |
| 157 | print(f.read()) |
| 158 | |
| 159 | Outputs:: |
| 160 | |
| 161 | 000000.002 Q-RX reset_input_buffer |
| 162 | 000000.002 DTR inactive |
| 163 | 000000.002 TX 0000 68 65 6C 6C 6F 20 77 6F 72 6C 64 hello world |
| 164 | 000001.015 RX 0000 68 65 6C 6C 6F 20 77 6F 72 6C 64 hello world |
| 165 | 000001.015 DTR active |
| 166 | 000001.015 TX 0000 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ................ |
| 167 | 000001.015 TX 0010 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ |
| 168 | 000001.015 TX 0020 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ |
| 169 | 000001.015 TX 0030 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>? |
| 170 | 000001.015 TX 0040 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F @ABCDEFGHIJKLMNO |
| 171 | 000001.016 TX 0050 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F PQRSTUVWXYZ[\]^_ |
| 172 | 000001.016 TX 0060 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F `abcdefghijklmno |
| 173 | 000001.016 TX 0070 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F pqrstuvwxyz{|}~. |
| 174 | 000001.016 TX 0080 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F ................ |
| 175 | 000001.016 TX 0090 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F ................ |
| 176 | 000001.016 TX 00A0 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF ................ |
| 177 | 000001.016 TX 00B0 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF ................ |
| 178 | 000001.016 TX 00C0 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF ................ |
| 179 | 000001.016 TX 00D0 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF ................ |
| 180 | 000001.016 TX 00E0 E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF ................ |
| 181 | 000001.016 TX 00F0 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ |
| 182 | 000002.284 RX 0000 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ................ |
| 183 | 000002.284 RX 0010 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ |
| 184 | 000002.284 RX 0020 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ |
| 185 | 000002.284 RX 0030 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>? |
| 186 | 000002.284 RX 0040 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F @ABCDEFGHIJKLMNO |
| 187 | 000002.284 RX 0050 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F PQRSTUVWXYZ[\]^_ |
| 188 | 000002.284 RX 0060 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F `abcdefghijklmno |
| 189 | 000002.284 RX 0070 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F pqrstuvwxyz{|}~. |
| 190 | 000002.284 RX 0080 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F ................ |
| 191 | 000002.284 RX 0090 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F ................ |
| 192 | 000002.284 RX 00A0 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF ................ |
| 193 | 000002.284 RX 00B0 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF ................ |
| 194 | 000002.284 RX 00C0 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF ................ |
| 195 | 000002.284 RX 00D0 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF ................ |
| 196 | 000002.284 RX 00E0 E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF ................ |
| 197 | 000002.284 RX 00F0 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ |
| 198 | 000002.284 BRK send_break 0.25 |
| 199 | |
Jakub Wilk | 772a6fa | 2016-12-20 21:59:27 +0100 | [diff] [blame] | 200 | Another example, on POSIX, open a second terminal window and find out it's |
Chris Liechti | d8af918 | 2016-12-08 18:23:03 +0100 | [diff] [blame] | 201 | device (e.g. with the ``ps`` command in the TTY column), assumed to be |
| 202 | ``/dev/pts/2`` here, double quotes are used so that the ampersand in the URL is |
| 203 | not interpreted by the shell:: |
| 204 | |
| 205 | python -m serial.tools.miniterm "spy:///dev/ttyUSB0?file=/dev/pts/2&color" 115200 |
| 206 | |
| 207 | The spy output will be live in the second terminal window. |
| 208 | |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 209 | .. versionadded:: 3.0 |
| 210 | |
| 211 | |
Chris Liechti | e015b40 | 2015-10-21 17:37:38 +0200 | [diff] [blame] | 212 | ``alt://`` |
| 213 | ========== |
Chris Liechti | bdf21a1 | 2017-03-19 21:55:18 +0100 | [diff] [blame^] | 214 | This handler allows to select alternate implementations of the native serial |
| 215 | port. |
Chris Liechti | e015b40 | 2015-10-21 17:37:38 +0200 | [diff] [blame] | 216 | |
Chris Liechti | d8af918 | 2016-12-08 18:23:03 +0100 | [diff] [blame] | 217 | Currently only the POSIX platform provides alternative implementations. |
Chris Liechti | e015b40 | 2015-10-21 17:37:38 +0200 | [diff] [blame] | 218 | |
| 219 | ``PosixPollSerial`` |
| 220 | Poll based read implementation. Not all systems support poll properly. |
| 221 | However this one has better handling of errors, such as a device |
| 222 | disconnecting while it's in use (e.g. USB-serial unplugged). |
| 223 | |
| 224 | ``VTIMESerial`` |
Chris Liechti | bdf21a1 | 2017-03-19 21:55:18 +0100 | [diff] [blame^] | 225 | Implement timeout using ``VTIME``/``VMIN`` of TTY device instead of using |
| 226 | ``select``. This means that inter character timeout and overall timeout |
Chris Liechti | e015b40 | 2015-10-21 17:37:38 +0200 | [diff] [blame] | 227 | can not be used at the same time. Overall timeout is disabled when |
Chris Liechti | bdf21a1 | 2017-03-19 21:55:18 +0100 | [diff] [blame^] | 228 | inter-character timeout is used. The error handling is degraded. |
Chris Liechti | e015b40 | 2015-10-21 17:37:38 +0200 | [diff] [blame] | 229 | |
| 230 | |
| 231 | Examples:: |
| 232 | |
| 233 | alt:///dev/ttyUSB0?class=PosixPollSerial |
| 234 | alt:///dev/ttyUSB0?class=VTIMESerial |
| 235 | |
| 236 | .. versionadded:: 3.0 |
| 237 | |
| 238 | |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 239 | Examples |
| 240 | ======== |
| 241 | |
| 242 | - ``rfc2217://localhost:7000`` |
| 243 | - ``rfc2217://localhost:7000?poll_modem`` |
| 244 | - ``rfc2217://localhost:7000?ign_set_control&timeout=5.5`` |
| 245 | - ``socket://localhost:7777`` |
| 246 | - ``loop://?logging=debug`` |
| 247 | - ``hwgrep://0451:f432`` (USB VID:PID) |
| 248 | - ``spy://COM54?file=log.txt`` |
Chris Liechti | e015b40 | 2015-10-21 17:37:38 +0200 | [diff] [blame] | 249 | - ``alt:///dev/ttyUSB0?class=PosixPollSerial`` |
Chris Liechti | 589c92a | 2015-09-04 23:04:34 +0200 | [diff] [blame] | 250 | |
| 251 | |