# Transports

Transport drivers own I/O, locking, and connection lifecycle. Concrete instrument drivers compose a
transport in their constructor rather than extending it.

## TransportBase

`TransportBase` is the base every transport implements: `_open_session`, `_teardown_session`, and `is_open`
are the required contract, and the base itself provides the `open`/`close` lifecycle with shared
ownership, so more than one driver can share a single connection. The first `open(holder)` opens it,
and it stays open until the last `close(holder)` frees it. See [Transports](https://dev.nominal.io/instro/library/transports/overview.md)
in the guides for the lifecycle contract, a worked combined-instrument example, and a walkthrough for
implementing a new transport.

| [`TransportBase`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.transport_base.TransportBase.md#instro.lib.transports.transport_base.TransportBase "instro.lib.transports.transport_base.TransportBase") | The contract a transport implements: `_open_session`, `_teardown_session`, `is_open`, plus shared ownership. |
| --- | --- |

## VisaDriver

| [`VisaDriver`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.VisaDriver.md#instro.lib.transports.visa.VisaDriver "instro.lib.transports.visa.VisaDriver") | Transport for VISA-attached instruments. |
| --- | --- |
| [`VisaConfig`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.VisaConfig.md#instro.lib.transports.visa.VisaConfig "instro.lib.transports.visa.VisaConfig") | Connection parameters for a VISA resource. |
| [`SerialConfig`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.SerialConfig.md#instro.lib.transports.visa.SerialConfig "instro.lib.transports.visa.SerialConfig") | Serial-line settings, applied when the VISA resource is an ASRL interface. |
| [`TerminatorConfig`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.TerminatorConfig.md#instro.lib.transports.visa.TerminatorConfig "instro.lib.transports.visa.TerminatorConfig") | Read and write terminators applied to the VISA resource. |
| [`TimeoutConfig`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.TimeoutConfig.md#instro.lib.transports.visa.TimeoutConfig "instro.lib.transports.visa.TimeoutConfig") | Operation timeouts in seconds. |
| [`StopBits`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.StopBits.md#instro.lib.transports.visa.StopBits "instro.lib.transports.visa.StopBits") |  |
| [`Parity`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.Parity.md#instro.lib.transports.visa.Parity "instro.lib.transports.visa.Parity") |  |
| [`ControlFlow`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.visa.ControlFlow.md#instro.lib.transports.visa.ControlFlow "instro.lib.transports.visa.ControlFlow") |  |

## Modbus transport

| [`ModbusTransport`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.modbus.ModbusTransport.md#instro.lib.transports.modbus.ModbusTransport "instro.lib.transports.modbus.ModbusTransport") | Abstract Modbus line: owns the session, locking, and every wire op, addressed per call via `unit_id`. |
| --- | --- |
| [`ModbusTCPTransport`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.modbus.ModbusTCPTransport.md#instro.lib.transports.modbus.ModbusTCPTransport "instro.lib.transports.modbus.ModbusTCPTransport") | A Modbus TCP line. |
| [`ModbusRTUTransport`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.modbus.ModbusRTUTransport.md#instro.lib.transports.modbus.ModbusRTUTransport "instro.lib.transports.modbus.ModbusRTUTransport") | A Modbus serial line (RTU or ASCII framing). |
| [`register_count`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.modbus.register_count.md#instro.lib.transports.modbus.register_count "instro.lib.transports.modbus.register_count") | Number of 16-bit registers `data_type` spans (uint16→1, uint32→2, uint64→4). |
| [`decode_registers`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.modbus.decode_registers.md#instro.lib.transports.modbus.decode_registers "instro.lib.transports.modbus.decode_registers") | Decode raw 16-bit registers into a typed value, applying byte/word/long swaps as configured. |
| [`encode_value`](https://dev.nominal.io/instro/ref/library/instro.lib.transports.modbus.encode_value.md#instro.lib.transports.modbus.encode_value "instro.lib.transports.modbus.encode_value") | Encode a typed value into 16-bit registers, applying byte/word/long swaps as configured. |
