Skip to content

Hardware Protocol Specification: BACnet MS/TP (Master-Slave/Token-Passing)

Version: ANSI/ASHRAE 135
Physical Layer: 9600 bps, 8N1.0
Framing: binary
Integrity Algorithm: crc8

📄 AsyncAPI Artifacts: Download AsyncAPI 2.6.0 YAML | View Interactive AsyncAPI HTML Docs

Description

Building-automation token-passing bus over RS-485. Has TWO independent CRCs in one frame: a header CRC and a separate data CRC -- and the data CRC is entirely absent when there's no data, not just zero-length.

Command Catalog & Message Signatures

Category: GENERAL

DataFrame (Command ID: 0x00) - integrityCheck (CRC-8) covers the fixed header only. secondaryIntegrityCheck (CRC-16, presentWhen=when-data-present) covers data and is entirely absent -- not even a zero-length placeholder -- when length=0, e.g. a Poll-For-Master token-passing frame with no data field at all.

Parameter Type Unit Range / Constraints Options
frameType uint8 - - -
destinationAddress uint8 - - -
sourceAddress uint8 - - -
data bytes - - -

Formal AsyncAPI 2.6.0 Specification

asyncapi: 2.6.0
info:
  title: BACnet MS/TP (Master-Slave/Token-Passing)
  version: ANSI/ASHRAE 135
  description: 'Building-automation token-passing bus over RS-485. Has TWO independent
    CRCs in one frame: a header CRC and a separate data CRC -- and the data CRC is
    entirely absent when there''s no data, not just zero-length.'
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: binary
        integrity: crc8
channels:
  omniuart/cmd/DataFrame:
    publish:
      summary: 'Send command DataFrame (ID: 0x00)'
      description: integrityCheck (CRC-8) covers the fixed header only. secondaryIntegrityCheck
        (CRC-16, presentWhen=when-data-present) covers data and is entirely absent
        -- not even a zero-length placeholder -- when length=0, e.g. a Poll-For-Master
        token-passing frame with no data field at all.
      message:
        name: DataFrame_Message
        title: DataFrame Command
        payload:
          $ref: '#/components/schemas/DataFrame_Request'
components:
  messages: {}
  schemas:
    DataFrame_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: 0
          description: Opcode ID for DataFrame
        frameType:
          type: integer
        destinationAddress:
          type: integer
        sourceAddress:
          type: integer
        data:
          type: string
          contentEncoding: base64
      description: integrityCheck (CRC-8) covers the fixed header only. secondaryIntegrityCheck
        (CRC-16, presentWhen=when-data-present) covers data and is entirely absent
        -- not even a zero-length placeholder -- when length=0, e.g. a Poll-For-Master
        token-passing frame with no data field at all.