Summary
The UT804 protocol was implemented from reverse engineering (Ghidra decompilation of UT804.exe V2.00 and binary constant extraction) and has never been tested against real hardware. Every aspect needs end-to-end verification.
Key finding: the UT804 uses FS9721-style 14-byte framing but with proprietary structured data — nibbles carry explicit mode codes, range codes and digit values, not raw LCD segment data.
What we need
Someone with a UT804 multimeter and its USB cable (CH9325 HID bridge, 1A86:E008).
What needs verification
Each line is one step of dmm-cli --device ut804 capture; a box gets ticked when a report from a real meter confirms it.
The CH9325 cable is receive-only, so the tool cannot press buttons: the hold step asks you to press HOLD, and the report's raw frames are what settle the flag encodings. Framing, the marker nibbles, the digit encoding, the sign, overload, AC+DC, the ADP/logic mode and the streaming rate are settled by the steps above.
Not covered by a capture step:
One box below is not a capture step. Auto-detection landed in #9 — --device auto is the default now, so the tool picks the meter itself — but only the UT61+ family has ever answered the detector on a bench. The UT804 arm was read off the vendor traces: the meter streams over the CH9325 cable, and detection tells a UT804 from a UT803 by the marker nibbles in the frame.
Verification steps
Use a dev build newer than 6d035fc4e2d15b2b6df7d22ea1a70b6c39e3a9c4, or build from source with cargo build --workspace.
dmm-cli list # the meter should be listed
RUST_LOG=dmm_lib=debug dmm-cli --device auto info # detection (#9): does it name your meter?
dmm-cli --device ut804 capture --unverified # the steps above, then attach capture-ut804.yaml
The tool captures each step on its own once the meter settles into the mode asked for, asks you to confirm readings against the LCD. It says up front what it needs on the bench (shorted leads, a DC source); tell it what you lack and those steps are skipped. The report auto-saves after each step, so an interrupted run can be resumed.
More options
dmm-cli --device ut804 capture --list-steps # every step, ✓ where hardware already confirmed it
dmm-cli --device ut804 capture --steps dcv,acv # a subset
dmm-cli --device ut804 capture # the full run, confirmed steps included
RUST_LOG=dmm_lib=trace dmm-cli --device ut804 debug --count 5 # only if `list` shows nothing or capture gets no frames
What to report
- Meter model and firmware version if shown at power-on
- OS, version and architecture; which archive, or
dmm-cli --version for a source build
- The cable: bundled or bought separately, and its VID:PID (CH9325
1A86:E008; lsusb, ioreg -p IOUSB -l, or Device Manager)
- The
capture-ut804.yaml file — it holds every frame the meter sent and every parse rejection, so no separate trace run is needed unless the meter is not detected at all
- An LCD photo beside the tool's output for any reading the tool got wrong
Protocol reference
docs/research/ut803/reverse-engineered-protocol.md
Summary
The UT804 protocol was implemented from reverse engineering (Ghidra decompilation of UT804.exe V2.00 and binary constant extraction) and has never been tested against real hardware. Every aspect needs end-to-end verification.
Key finding: the UT804 uses FS9721-style 14-byte framing but with proprietary structured data — nibbles carry explicit mode codes, range codes and digit values, not raw LCD segment data.
What we need
Someone with a UT804 multimeter and its USB cable (CH9325 HID bridge,
1A86:E008).What needs verification
Each line is one step of
dmm-cli --device ut804 capture; a box gets ticked when a report from a real meter confirms it.dcv— Set meter to DC Vdcv_short— DC V mode: touch the two probe tips together.dcv_negative— Set meter to DC V with leads reversed (negative reading)acv— Set meter to AC Vacdcv— Set meter to AC+DC V (if the meter has it)dcmv— Set meter to DC mVacmv— Set meter to AC mV (if the meter has it)ohm— Set meter to Resistance (Ω)ohm_ol— Set meter to Resistance (Ω) with open leads (overload)ohm_body— Resistance mode: hold one probe tip between the fingers of each hand (body resistance, hundreds of kΩ).ohm_short— Resistance mode: touch the two probe tips together.cap— Set meter to Capacitancehz— Set meter to Frequency (Hz)duty— Frequency mode: switch the display to Duty Cycle (%)rpm— Set meter to Tachometer / RPM (UT803 only)diode— Set meter to Diodecont— Set meter to Continuitytemp— Set meter to temperature (K-type thermocouple, if available)dcua— Set meter to DC µAacua— Set meter to AC µAdcma— Set meter to DC mAacma— Set meter to AC mAdca— Set meter to DC Aaca— Set meter to AC Aadp— Set meter to ADP / logic (UT804 only)ma_percent— Set meter to % (4-20 mA loop)hold— Press HOLD (wire encoding unknown — capture needed)The CH9325 cable is receive-only, so the tool cannot press buttons: the
holdstep asks you to press HOLD, and the report's raw frames are what settle the flag encodings. Framing, the marker nibbles, the digit encoding, the sign, overload, AC+DC, the ADP/logic mode and the streaming rate are settled by the steps above.Not covered by a capture step:
extrafreeform capture and say which annunciator was lit; nibbles 12–14 are the candidates0x5Atrigger byte — the tool does not send it; if nothing ever streams, say soOne box below is not a capture step. Auto-detection landed in #9 —
--device autois the default now, so the tool picks the meter itself — but only the UT61+ family has ever answered the detector on a bench. The UT804 arm was read off the vendor traces: the meter streams over the CH9325 cable, and detection tells a UT804 from a UT803 by the marker nibbles in the frame.--devicegivenVerification steps
Use a dev build newer than 6d035fc4e2d15b2b6df7d22ea1a70b6c39e3a9c4, or build from source with
cargo build --workspace.The tool captures each step on its own once the meter settles into the mode asked for, asks you to confirm readings against the LCD. It says up front what it needs on the bench (shorted leads, a DC source); tell it what you lack and those steps are skipped. The report auto-saves after each step, so an interrupted run can be resumed.
More options
What to report
dmm-cli --versionfor a source build1A86:E008;lsusb,ioreg -p IOUSB -l, or Device Manager)capture-ut804.yamlfile — it holds every frame the meter sent and every parse rejection, so no separate trace run is needed unless the meter is not detected at allProtocol reference
docs/research/ut803/reverse-engineered-protocol.md