Skip to content

Comm — Raw Bus Transactions

Perform raw bus transactions over I2C, UART, SPI, and TCP sockets. All byte data is hex-encoded on the wire; the client handles encoding and decoding transparently so callers work with plain bytes objects.

Methods

Method Returns Description
i2c(device_name, address, action, ...) BusTransactionResponse I2C bus transaction.
uart(device_name, action, ...) BusTransactionResponse UART transaction.
spi(device_name, action, ...) BusTransactionResponse SPI transaction.
socket(device_name, action, ...) BusTransactionResponse TCP socket transaction.

All methods return a BusTransactionResponse with:

Field Type Description
device_name str Device used for the transaction
action str Action performed
received bytes Received data (decoded from hex)
number_of_bytes_received int Number of bytes received

I2C

client.comm.i2c(device_name, address, action,
                data_to_send=None, number_of_bytes_to_receive=0,
                max_retries=-1)
Parameter Type Description
device_name str Device name as registered in the hardware manager
address int I2C 7-bit device address (0–127)
action BusActions SEND, RECEIVE, SEND_RECEIVE, or SCAN
data_to_send bytes Bytes to transmit (required for Send/SendReceive)
number_of_bytes_to_receive int Expected byte count for Receive/SendReceive
max_retries int Retry limit on NAK (-1 = device default)

Examples

from accordionq2.enums import BusActions

# Scan the bus for connected devices
resp = client.comm.i2c("0.ESH10000597.I2C00", address=0x00,
                       action=BusActions.SCAN)
for addr in resp.received:
    print(f"Found device at 0x{addr:02X}")

# Write two bytes to address 0x50
client.comm.i2c("0.ESH10000597.I2C00", address=0x50,
                action=BusActions.SEND,
                data_to_send=bytes([0x00, 0x10]))

# Read 4 bytes from address 0x50
resp = client.comm.i2c("0.ESH10000597.I2C00", address=0x50,
                       action=BusActions.RECEIVE,
                       number_of_bytes_to_receive=4)
print(resp.received.hex())  # e.g. "aabbccdd"

# Write-then-read (SendReceive)
resp = client.comm.i2c("0.ESH10000597.I2C00", address=0x50,
                       action=BusActions.SEND_RECEIVE,
                       data_to_send=bytes([0x00]),
                       number_of_bytes_to_receive=2)

UART

client.comm.uart(device_name, action,
                 baud_rate=9600,
                 bus_type=UartBusTypes.RS232,
                 flow_control=FlowControlTypes.NONE,
                 parity=ParityTypes.NONE,
                 use_termination_byte=False, termination_byte=0x0A,
                 data_to_send=None, number_of_bytes_to_receive=0,
                 timeout_ms=1000)
Parameter Type Default Description
device_name str Device name as registered in the hardware manager
action BusActions SEND, RECEIVE, SEND_RECEIVE, or CLEAR_BUFFERS
baud_rate int 9600 Baud rate (e.g. 9600, 115200)
bus_type UartBusTypes RS232 Electrical standard
flow_control FlowControlTypes NONE Flow control mode
parity ParityTypes NONE Parity setting
use_termination_byte bool False Whether to use termination_byte as a receive boundary
termination_byte int 0x0A Termination byte value (0–255)
data_to_send bytes None Bytes to transmit (required for Send/SendReceive)
number_of_bytes_to_receive int 0 Expected receive count
timeout_ms int 1000 Receive timeout in milliseconds

Example

from accordionq2.enums import BusActions, FlowControlTypes, ParityTypes, UartBusTypes

# Send a SCPI query at 115200 baud and read the response
resp = client.comm.uart(
    "MyUartDevice",
    action=BusActions.SEND_RECEIVE,
    baud_rate=115200,
    bus_type=UartBusTypes.RS232,
    parity=ParityTypes.NONE,
    flow_control=FlowControlTypes.NONE,
    data_to_send=b"*IDN?\n",
    number_of_bytes_to_receive=64,
    timeout_ms=2000,
)
print(resp.received.decode("ascii"))

SPI

client.comm.spi(device_name, action,
                data_to_send=None, number_of_bytes_to_receive=0)
Parameter Type Description
device_name str Device name as registered in the hardware manager
action BusActions SEND, RECEIVE, or SEND_RECEIVE
data_to_send bytes Bytes to clock out
number_of_bytes_to_receive int Expected receive count

Example

# Full-duplex SPI transfer
resp = client.comm.spi("MySpiDevice",
                       action=BusActions.SEND_RECEIVE,
                       data_to_send=bytes([0xAA, 0xBB]),
                       number_of_bytes_to_receive=2)
print(resp.received.hex())

Socket (TCP/IP)

client.comm.socket(device_name, action,
                   host_name="", port=0,
                   data_to_send=None, number_of_bytes_to_receive=0,
                   termination_byte=0, use_termination_byte=False,
                   timeout_ms=1000)
Parameter Type Description
device_name str Device name as registered in the hardware manager
action BusActions SEND, RECEIVE, or SEND_RECEIVE
host_name str Remote host name or IP address
port int Remote TCP port number
data_to_send bytes Bytes to send
number_of_bytes_to_receive int Expected receive count
termination_byte int Byte value used as a message boundary (0–255)
use_termination_byte bool Whether to use termination_byte as end-of-message marker
timeout_ms int Receive timeout in milliseconds

Example

# Send a SCPI query over TCP
resp = client.comm.socket("MySocketDevice",
                          action=BusActions.SEND_RECEIVE,
                          host_name="192.168.1.10", port=5025,
                          data_to_send=b"*IDN?\n",
                          number_of_bytes_to_receive=64)
print(resp.received.decode("ascii"))