# Hardware Protocol Specification: SCPI (Standard Commands for Programmable Instruments) over RS-232

**Version**: `SCPI-99 / IEEE 488.2`  
**Physical Layer**: `9600 bps, 8N1.0`  
**Framing**: `delimited`  
**Integrity Algorithm**: `none`  

> 📄 **AsyncAPI Artifacts**: Download [AsyncAPI 2.6.0 YAML](asyncapi/scpi-uart-interface.yaml) | View [Interactive AsyncAPI HTML Docs](asyncapi/scpi-uart-interface.html)

## Description
ASCII line-based instrument control (oscilloscopes, PSUs, DMMs). Baud is configured manually on both sides -- no auto-negotiation -- and commonly must match exactly or the instrument just doesn't respond, with no error reported at all. Chains multiple independent commands onto one physical line via ';', which compoundMessageDelimiter exists specifically for.

## Command Catalog & Message Signatures

### Category: SCPI/SYSTEM

#### `Identify` (Command ID: `*IDN?`) - *IDN? System identification query.

#### `Reset` (Command ID: `*RST`) - *RST System reset command.

#### `ClearStatus` (Command ID: `*CLS`) - *CLS Clear status registers.

### Category: DASHBOARD

#### `Identify` (Command ID: `*IDN?`) - *IDN? System identification query.

#### `MeasureVoltageDC` (Command ID: `MEAS:VOLT:DC?`) - MEAS:VOLT:DC? Measure DC voltage in Volts.

### Category: SCPI/MEASURE

#### `MeasureVoltageDC` (Command ID: `MEAS:VOLT:DC?`) - MEAS:VOLT:DC? Measure DC voltage in Volts.

#### `MeasureCurrentDC` (Command ID: `MEAS:CURR:DC?`) - MEAS:CURR:DC? Measure DC current in Amperes.

### Category: SCPI/SOURCE

#### `SetVoltageOutput` (Command ID: `SOUR:VOLT `) - SOUR:VOLT <val> Set programmable power supply output voltage.

| Parameter | Type | Unit | Range / Constraints | Options |
| :--- | :--- | :--- | :--- | :--- |
| `voltage` | `float32` | - | - | - |

## Device-Initiated Messages

#### `IdentifyResult` (Message ID: `IdentifyResult`) - e.g. 'ACME,MM7,SN12345,FW2.1'

| Field Name | Type | Unit |
| :--- | :--- | :--- |
| `manufacturer` | `string` | - |
| `model` | `string` | - |
| `serial` | `string` | - |
| `firmware` | `string` | - |

## Formal AsyncAPI 2.6.0 Specification

```yaml
asyncapi: 2.6.0
info:
  title: SCPI (Standard Commands for Programmable Instruments) over RS-232
  version: SCPI-99 / IEEE 488.2
  description: ASCII line-based instrument control (oscilloscopes, PSUs, DMMs). Baud
    is configured manually on both sides -- no auto-negotiation -- and commonly must
    match exactly or the instrument just doesn't respond, with no error reported at
    all. Chains multiple independent commands onto one physical line via ';', which
    compoundMessageDelimiter exists specifically for.
servers:
  serial_link:
    url: serial://tty/9600
    protocol: serial
    description: Physical UART Transport (9600 bps, 8N1.0)
    bindings:
      serial:
        baudRate: 9600
        dataBits: 8
        parity: none
        stopBits: 1.0
        framingType: delimited
        integrity: none
channels:
  omniuart/cmd/Identify:
    publish:
      summary: 'Send command Identify (ID: *IDN?)'
      description: '*IDN? System identification query.'
      message:
        name: Identify_Message
        title: Identify Command
        payload:
          $ref: '#/components/schemas/Identify_Request'
  omniuart/cmd/Reset:
    publish:
      summary: 'Send command Reset (ID: *RST)'
      description: '*RST System reset command.'
      message:
        name: Reset_Message
        title: Reset Command
        payload:
          $ref: '#/components/schemas/Reset_Request'
  omniuart/cmd/ClearStatus:
    publish:
      summary: 'Send command ClearStatus (ID: *CLS)'
      description: '*CLS Clear status registers.'
      message:
        name: ClearStatus_Message
        title: ClearStatus Command
        payload:
          $ref: '#/components/schemas/ClearStatus_Request'
  omniuart/cmd/MeasureVoltageDC:
    publish:
      summary: 'Send command MeasureVoltageDC (ID: MEAS:VOLT:DC?)'
      description: MEAS:VOLT:DC? Measure DC voltage in Volts.
      message:
        name: MeasureVoltageDC_Message
        title: MeasureVoltageDC Command
        payload:
          $ref: '#/components/schemas/MeasureVoltageDC_Request'
  omniuart/cmd/MeasureCurrentDC:
    publish:
      summary: 'Send command MeasureCurrentDC (ID: MEAS:CURR:DC?)'
      description: MEAS:CURR:DC? Measure DC current in Amperes.
      message:
        name: MeasureCurrentDC_Message
        title: MeasureCurrentDC Command
        payload:
          $ref: '#/components/schemas/MeasureCurrentDC_Request'
  omniuart/cmd/SetVoltageOutput:
    publish:
      summary: 'Send command SetVoltageOutput (ID: SOUR:VOLT )'
      description: SOUR:VOLT <val> Set programmable power supply output voltage.
      message:
        name: SetVoltageOutput_Message
        title: SetVoltageOutput Command
        payload:
          $ref: '#/components/schemas/SetVoltageOutput_Request'
  omniuart/telemetry/IdentifyResult:
    subscribe:
      summary: 'Unsolicited telemetry message IdentifyResult (ID: IdentifyResult)'
      description: e.g. 'ACME,MM7,SN12345,FW2.1'
      message:
        name: IdentifyResult_Telemetry_Message
        title: IdentifyResult Telemetry
        payload:
          $ref: '#/components/schemas/IdentifyResult_Telemetry'
components:
  messages: {}
  schemas:
    Identify_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: '*IDN?'
          description: Opcode ID for Identify
      description: '*IDN? System identification query.'
    Reset_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: '*RST'
          description: Opcode ID for Reset
      description: '*RST System reset command.'
    ClearStatus_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: '*CLS'
          description: Opcode ID for ClearStatus
      description: '*CLS Clear status registers.'
    MeasureVoltageDC_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: MEAS:VOLT:DC?
          description: Opcode ID for MeasureVoltageDC
      description: MEAS:VOLT:DC? Measure DC voltage in Volts.
    MeasureCurrentDC_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: MEAS:CURR:DC?
          description: Opcode ID for MeasureCurrentDC
      description: MEAS:CURR:DC? Measure DC current in Amperes.
    SetVoltageOutput_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: 'SOUR:VOLT '
          description: Opcode ID for SetVoltageOutput
        voltage:
          type: number
      description: SOUR:VOLT <val> Set programmable power supply output voltage.
    IdentifyResult_Telemetry:
      type: object
      properties:
        manufacturer:
          type: string
        model:
          type: string
        serial:
          type: string
        firmware:
          type: string
      description: e.g. 'ACME,MM7,SN12345,FW2.1'

```
