A lot of the data on an airliner still moves over ARINC 429: the air data computer telling the displays the altitude, the inertial reference units reporting heading, the radios reporting what they're tuned to. The standard dates from the late 1970s. It's slow, it's simple, and it's everywhere, including inside the full flight simulators I work on, where real avionics boxes have to be fed believable words. If you work around aircraft, you end up reading it off an analyzer screen sooner or later.
This is the explainer I wish I'd had the first time.
The wire
- One way. A bus has exactly one transmitter and up to 20 receivers. If two boxes need to talk to each other, that's two buses.
- Twisted, shielded pair, bipolar return-to-zero. Each bit is a positive pulse for a one or a negative pulse for a zero, and the line drops back to zero volts halfway through every bit. Because every bit has a transition, the signal carries its own clock.
- Two speeds. Low speed runs at 12.5 to 14.5 kbps, high speed at 100 kbps. Any one bus runs at one speed.
- A gap between words. Words are separated by at least four bit times of null. That gap is how a receiver knows a new word is starting.
There's no addressing and no handshake. A transmitter repeats its words at a set rate, forever, and each receiver picks out the ones it cares about by their label.
The word
Every word is 32 bits, numbered 1 to 32, split into five fields:
| Bits | Field | What it holds |
|---|---|---|
| 1–8 | Label | Which parameter this is, written in octal |
| 9–10 | SDI | Source/destination identifier |
| 11–29 | Data | The value: binary (BNR), decimal (BCD), discretes or text |
| 30–31 | SSM | Sign/status matrix: is this value good, and for BCD, which sign |
| 32 | P | Odd parity over the whole word |
Here's a real one, laid out bit 32 first, the way most analyzers show it. Tap any bit and watch the decode change. The buttons underneath load a few other words worth seeing.
Demo scopeThis little decoder only knows label 203. Change the label bits and it falls back to showing the raw data field.
The label, and why it looks backwards
The label is eight bits, always written as three octal digits. 203 is pressure altitude; 206 is computed airspeed. Each label has a definition that says how to read the rest of the word: the data type, the range, the resolution and the units.
Here's the odd part. The label is transmitted most significant bit first, while the rest of the word goes out least significant bit first. Write the word as one 32-bit number and the label, sitting in bits 1–8, comes out bit-reversed compared to everything else:
label 203 (octal) 2 0 3
as 8 bits, MSB first 10 000 011
placed in bits 1..8 bit1=1 bit2=0 bit3=0 bit4=0 bit5=0 bit6=0 bit7=1 bit8=1
read as a hex byte bit8..bit1 = 1100 0001 = 0xC1 (not 0x83)
That's why the example word ends in C1. Some analyzers flip the label for you and some don't, which is where a lot of confused troubleshooting starts.
SDI: which box
Bits 9 and 10. When identical units share a design, say left, center and right, the SDI says which one sent the word or which receiver it's meant for. Labels that don't need it can use those two bits as extra data instead.
Data, part one: BNR
BNR is plain binary in two's complement. Bit 29 is the sign, and the magnitude runs down from bit 28. Every BNR label defines a range and a number of significant bits, and the resolution, the value of one count, falls out of those:
resolution = range / 2significant bits
Label 203 has a range of 131,072 ft and 17 significant bits, so one count is 131,072 / 217 = 1 ft. Bit 28 is worth 65,536 ft, bit 27 is worth 32,768 ft, and so on down to bit 12 at 1 ft. Bit 11 isn't used by this label. Negative values are two's complement across the field, sign bit included, which is why −1,000 ft in the buttons above sets the sign bit and a long run of ones below it.
Data, part two: BCD
BCD packs decimal digits, four bits each. A word holds up to five characters: the most significant one in bits 27–29 (three bits, so it can only be 0 to 7), then four-bit digits down to bit 11. Values people dial in or read directly, such as frequencies, selected headings and ground speed, tend to be BCD. Where the value has a sign, it doesn't live in bit 29. It lives in the SSM.
SSM: is this value any good?
Bits 30 and 31 carry the sign/status matrix, and what they mean depends on the data type. Written as bit 31 then bit 30:
| SSM | BNR words | BCD words |
|---|---|---|
| 00 | Failure warning | Plus, north, east, right, to, above |
| 01 | No computed data | No computed data |
| 10 | Functional test | Functional test |
| 11 | Normal operation | Minus, south, west, left, from, below |
That table is a trap. In BNR, 11 means good and 00 means the source has failed. In BCD, 00 and 11 are both normal, and they carry the sign. Read a BCD word with BNR eyes and every northern latitude looks like a failure warning.
Discretes and text
Discretes are single-bit flags: a valve open or closed, a mode engaged or not. Some labels are nothing but discretes. Others tuck a few discrete bits into the unused low end of a BNR or BCD field, so "unused" bits are worth a second look.
Text shows up in maintenance and system messages, encoded in ISO Alphabet No. 5, the same 7-bit character set as ASCII. Characters are packed into the data bits, typically three per word, and control characters like STX and ETX frame a message that spans many words. The exact packing varies by system, so it pays to know which box you're listening to.
Parity
Bit 32 is set so the total number of ones in the word is odd. A receiver that counts an even number discards the word. That catches any single flipped bit, and any odd number of them, but two flipped bits cancel out and sail through.
Worked example: 0x6445C0C1
Here's the word from the top of this page, by hand.
hex 6 4 4 5 C 0 C 1
bits 0110 0100 0100 0101 1100 0000 1100 0001
^ bit 32 bit 1 ^
bit 32 0 parity
bits 31-30 11 SSM
bit 29 0 sign: positive
bits 28-12 01000100010111000 magnitude
bit 11 0 not used by label 203
bits 10-9 00 SDI
bits 8-1 11000001 label, as stored
- Label. Read bits 1 to 8 with bit 1 as the most significant:
10000011, which is octal 203. Pressure altitude: BNR, 17 significant bits, 1 ft per count. - SDI.
00. - Data. Sign bit 29 is 0, so the value is positive. Bits 28 to 12 are
01000100010111000. The ones sit at bits 27, 23, 19, 17, 16 and 15, worth 32,768 + 2,048 + 128 + 32 + 16 + 8 = 35,000 ft. - SSM.
11: normal operation. - Parity. Count the ones digit by digit (6, 4, 4, 5, C, 0, C, 1 give 2, 1, 1, 2, 2, 0, 2, 1): eleven. Odd, so bit 32 stays 0 and the parity checks out.
Pressure altitude +35,000 ft, valid data, from SDI 00. Flight level 350.
The full tool
Decoding by hand is a good way to learn and a bad way to work. pocket429 is the full version of the demo above: it decodes and builds words in BNR, BCD and ISO-5 text against a label database compiled from cited manuals, detects reversed bit order, and can read words off a photo of an analyzer screen. It's coming to the App Store, and there's a web version at pocket429.dillongreen.dev.
Reference onlyThis post explains the format. It isn't approved maintenance data. For anything that touches an aircraft, use the manufacturer's documentation and your approved procedures.
I'm building small tools like pocket429 for people who work on aircraft and simulators. If there's a manual workflow that drives you up the wall, tell me about it.