Plain CI-V: The Documented Path
Status: research draft, 2026-08-18.
CI-V is Icom's long-standing serial control protocol. Unlike the network protocol in protocol-notes.md, CI-V is documented by Icom, published as a "CI-V Reference Guide" PDF per radio, and has been stable in shape since the 1980s. There is no reverse engineering required and no licensing ambiguity around the command set itself.
The IC-7300 MK2 exposes CI-V three ways:
- Over the rear USB port as a virtual serial port
- Over the 3.5 mm CI-V remote jack
- Tunnelled inside the network protocol's CI-V stream
Point 3 is the important one. The network protocol does not define its own command language; it carries CI-V frames verbatim. So the entire command layer of a well built client is transport independent, and can be built and tested over USB before any UDP work begins.
Framing
FE FE <to> <from> <cmd> [<subcmd>] [<data> ...] FD
FE FEpreamble,FDterminator<to>destination CI-V address<from>source CI-V address, conventionally0xE0for a controller- Radio replies with
to/fromswapped 0xFBis ACK,0xFAis NAK, both returned as a one byte payload
Addresses relevant here:
| Radio | Address |
|---|---|
| IC-7300 | 0x94 |
| IC-7300 MK2 | 0xB6 (confirmed on hardware) |
| IC-7610 | 0x98 |
| IC-705 | 0xA4 |
| IC-9700 | 0xA2 |
| Controller (PC) | 0xE0 |
The address is user-changeable in the radio's menu, so read it from settings rather than hardcoding, but 0xB6 is the MK2 factory default.
BCD encoding
Numeric fields are packed BCD, and frequency is little-endian BCD, which catches everyone once. 14.074000 MHz is sent as five bytes:
00 40 07 14 00
| | | | +-- 100 MHz / 1 GHz digits
| | | +----- 1 MHz / 10 MHz
| | +-------- 10 kHz / 100 kHz
| +----------- 100 Hz / 1 kHz
+-------------- 1 Hz / 10 Hz
Levels and most other scalars are two byte BCD in the range 0000 to 0255.
Command surface
The commands that matter for a general purpose control head, all documented by Icom:
| Cmd | Sub | Function |
|---|---|---|
| 0x00 | Set frequency (transceive broadcast) | |
| 0x01 | Set mode (transceive broadcast) | |
| 0x03 | Read operating frequency | |
| 0x04 | Read operating mode and filter | |
| 0x05 | Set operating frequency | |
| 0x06 | Set operating mode and filter | |
| 0x07 | VFO select, A/B, split, swap | |
| 0x08 | Memory channel select | |
| 0x0F | Split and duplex on/off | |
| 0x11 | Attenuator | |
| 0x14 | 0x01 | AF level |
| 0x14 | 0x02 | RF gain |
| 0x14 | 0x03 | Squelch |
| 0x14 | 0x0A | RF power |
| 0x14 | 0x0B | Mic gain |
| 0x14 | 0x0C | CW keying speed |
| 0x14 | 0x0E | Compressor level |
| 0x14 | 0x0F | Break-in delay |
| 0x15 | 0x01 | Squelch status |
| 0x15 | 0x02 | S-meter |
| 0x15 | 0x11 | RF power meter |
| 0x15 | 0x12 | SWR meter |
| 0x15 | 0x13 | ALC meter |
| 0x15 | 0x14 | Compression meter |
| 0x15 | 0x15 | Vd meter |
| 0x15 | 0x16 | Id meter |
| 0x16 | 0x02 | Preamp |
| 0x16 | 0x22 | Noise blanker on/off |
| 0x16 | 0x40 | Noise reduction on/off |
| 0x16 | 0x41 | Auto notch |
| 0x16 | 0x44 | Speech compressor |
| 0x16 | 0x46 | VOX |
| 0x16 | 0x47 | Break-in |
| 0x16 | 0x4F | Manual notch |
| 0x16 | 0x50 | AGC time constant |
| 0x1A | 0x05 | Menu items (the large indexed settings space) |
| 0x1A | 0x06 | DATA mode with filter |
| 0x1C | 0x00 | PTT on/off |
| 0x1C | 0x01 | Tuner control |
| 0x21 | 0x00 | RIT offset |
| 0x21 | 0x01 | RIT on/off |
| 0x21 | 0x02 | dTX (XIT) on/off |
| 0x25 | Read or set unselected VFO frequency | |
| 0x26 | Read or set unselected VFO mode | |
| 0x27 | 0x00 | Scope waveform data output |
| 0x27 | 0x10 | Scope on/off |
| 0x27 | 0x11 | Scope waveform data output on/off |
| 0x27 | 0x14 | Scope centre/fixed mode |
| 0x27 | 0x15 | Scope span (centre mode) |
| 0x27 | 0x16 | Scope fixed edge selection |
| 0x27 | 0x17 | Scope hold |
| 0x27 | 0x19 | Scope reference level |
| 0x27 | 0x1A | Scope sweep speed |
The MK2's command set is essentially unchanged from the MK1; wfview's rig definitions list the same 183 commands for both. Get the official CI-V Reference Guide PDF for the MK2 and treat it as the source of truth over any third-party table, including this one.
Transceive mode
If "CI-V Transceive" is enabled in the radio menu, the radio spontaneously broadcasts frequency (0x00) and mode (0x01) changes whenever the operator turns the dial. This is how you get responsive UI without aggressive polling. Enable it, and poll only for things that do not broadcast (meters, mostly).
What CI-V alone can and cannot do
This is the central scoping question for the roadmap, so be precise about it.
Achievable over plain CI-V, no network protocol needed
- Frequency read and set, both VFOs
- Mode, filter width, DATA mode
- Band and memory selection
- Scope and waterfall waveform data via 0x27 0x00
- All scope configuration: span, centre/fixed, edges, reference level, speed, hold
- S-meter, SWR, ALC, power, Vd, Id meters
- RF power, AF, RF gain, squelch, mic gain
- Preamp, attenuator, AGC, noise blanker, noise reduction, notch
- Split, RIT, XIT
- PTT keying via 0x1C 0x00
- Antenna tuner
- Almost the entire menu system via 0x1A 0x05
In other words: everything in Milestone 0 and Milestone 1 is achievable over plain, documented CI-V.
Requires the undocumented network protocol
- Audio, in both directions. This is the only genuine functional gap.
- Operating without a machine physically cabled to the radio's USB port.
- Remote power on and off of the radio itself.
The audio caveat that changes the calculus
Even audio has a documented workaround on this radio. The IC-7300 MK2's USB port presents a USB audio class device alongside the serial port, exactly as the MK1 does. A daemon on a machine cabled to the radio can capture RX audio and play TX audio through a standard sound card interface, with no Icom network protocol involved at all.
So the honest statement is:
The undocumented network protocol buys you exactly one thing: removing the requirement for a computer physically attached to the radio.
That is a real product benefit and it is why the MK2 has an Ethernet port. But it is a deployment benefit, not a capability benefit. Every feature through Milestone 2 can be delivered over USB CI-V plus USB audio, using only documented interfaces, with zero legal ambiguity.
Transport comparison
| USB CI-V | Network protocol | |
|---|---|---|
| Documented by Icom | Yes | No |
| Legal ambiguity | None | Reverse engineered |
| Implementation effort | Days | Weeks |
| Needs PC at the radio | Yes | No |
| Scope sweep rate | 4/sec measured, even on FAST | 30/sec measured, single-packet sweeps |
| Audio | Via USB sound card | Via UDP audio stream |
| Remote power on | No | Yes |
| Concurrent with WSJT-X | Contended, needs arbitration | Contended, needs arbitration |
Baud rate note
Set the MK2's CI-V baud to 115200. At 19200 the scope stream alone will saturate the link. Even at 115200, a full 475 bin sweep split across 11 CI-V messages with framing overhead is roughly 600 bytes, so the theoretical ceiling is about 19 sweeps per second and the practical figure once normal polling shares the link is closer to 10 to 15. That is acceptable for a waterfall and noticeably worse than what the LAN transport will deliver.
Recommendation
Build the CI-V command layer first, behind a transport interface with two implementations. Ship Milestone 0 on USB. This removes the entire undocumented protocol from the critical path of proving the product, while producing code that is 100% reused when the LAN transport lands.