This protocol description is based on the recovered HC11 ROM and pin-level emulation. Some live hardware probing has shown related line-oriented command families that are not fully reconciled with this ROM-visible parser, so verify the protocol on your unit before using write commands.
- MCU SCI on
PD0/PD1 - default
300baud 8N1- No checksum
- Immediate commands are a single byte
- Decimal setters use
CRas the terminator - Raw setters use binary little-endian payload bytes
The packaged client and REPL default to 300 baud. The REPL also supports baud <rate> for close variants that use a different crystal or divider.
The observed LHS-family hardware exposes the serial interface on a 4-position RJ11 jack. Viewed from the back of the unit with the plate upright, the pins run left to right as:
Rear view, plate upright
+---RJ11 jack---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
| | | |
| | | +-- Plate Tx -> controller/driver Rx
| | +------ GND
| +---------- GND
+-------------- Plate Rx <- controller/driver Tx
The plate-side signaling is inverted relative to a plain TTL UART. Use either:
- an inverting RS-232 transceiver path, such as an
SP232ACP - or a TTL adapter with both
RxandTxexplicitly configured as inverted
Relevant SP232ACP electrical points:
- RS-232 receiver input range:
-15 Vto+15 V - receiver threshold region: about
0.8 Vto2.4 V - typical receiver thresholds at
5 V:1.2 Vlow and1.7 Vhigh - typical hysteresis:
0.5 V - RS-232 transmit swing: about
±6.5 Vtypical,±5.0 Vminimum into3 kΩ
If F and the rest of the known command set appear silent on an otherwise valid wiring setup, inversion is the first thing to check.
Immediate:
C e F G i j k l m n o p
Raw setters:
A B D E <lo> <hi>
Decimal setters:
a b c d f g h <ascii-digits> <CR>
C,e: clear active probe/plate target mode bitsF: return a 10-byte binary snapshotG,p: trigger the 3-chirp alarm pattern used at timer expiryi: query probe temperature in Cj: query probe temperature in Fk: query plate temperature in Cl: query plate temperature in Fm: query measured stir speed in RPMn: query ramp in C/houro: query ramp in F/hour
Query replies are ASCII digits followed by CR LF. i and j return blank CR LF when no probe is connected.
A <lo> <hi>: set probe target rawB <lo> <hi>: set plate target rawD <lo> <hi>: set stir target raw, low byte only is meaningfulE <lo> <hi>: set ramp raw
Examples:
41 50 46->A 0x465042 BC 34->B 0x34BC44 1E 00->D 0x001E45 5A 00->E 0x005A
a<digits><CR>: set probe target in Cb<digits><CR>: set probe target in Fc<digits><CR>: set plate target in Cd<digits><CR>: set plate target in Ff<digits><CR>: set stir target in RPMg<digits><CR>: set ramp in C/hourh<digits><CR>: set ramp in F/hour
raw = (degC + 100) * 90
raw = (degF + 148) * 50
degC = raw / 90 - 100
degF = raw / 50 - 148
Validated examples:
a100<CR>==b212<CR>== raw0x4650c50<CR>==d122<CR>== raw0x34BC
raw = rpm / 10
rpm = raw * 10
Validated example:
f300<CR>stores raw0x1E
Ramp is expressed in degrees per hour.
raw = degC_per_hour * 9
raw = degF_per_hour * 5
degC_per_hour = raw / 9
degF_per_hour = raw / 5
Validated example:
g10<CR>==h18<CR>== raw0x005A
F returns 10 bytes with no terminator:
byte 0: status_b1
byte 1: stir_measured_raw
byte 2: probe_temp_raw low
byte 3: probe_temp_raw high
byte 4: plate_temp_raw low
byte 5: plate_temp_raw high
byte 6: active_setpoint_raw low
byte 7: active_setpoint_raw high
byte 8: ramp_raw low
byte 9: ramp_raw high
The wire format is little-endian for all 16-bit fields.
Known status bits:
0x08: probe target mode active0x10: plate target mode active
Observed first-byte values in live testing:
0x00: no active temperature target mode0x08: probe target mode active0x10: plate target mode active
Live stir validation:
recv: 00 6D 00 00 4D 38 50 46 00 00
Decoded:
- measured stir raw =
0x6D->1090 RPM - plate temp raw =
0x384D - active setpoint raw =
0x4650
The Python client exposes:
- low-level transport:
immediate(),raw16le(),decimal(),send_ascii(),send_hex(),send_bytes() - semantic helpers:
set_plate_temp_c(),set_probe_temp_c(),set_stir_rpm(),set_ramp_c(), query helpers, andsnapshot() - interface verification:
verify_interface()