LEGO Powered Up protocol context for the Megahub project. Use when working on LEGO device communication, lpfuart library, UART parsing, motor control, sensor modes, device initialization, or debugging UART noise/corruption issues.
lib/lpfuart/ — legodevice.cpp, lumpparser.cpp, SC16IS752serialadapter.cppDevices send identification messages on connect. Never skip any step.
LUMP_CMD_TYPE — device reports its type ID and nameLUMP_CMD_MODES — device reports number of supported modesLUMP_CMD_SPEED — device requests baud rate to switch toLUMP_CMD_VERSIONLUMP_INFO_NAME/RAW/PCT/SI/UNITS/MAPPING/FORMAT — per-mode metadata (repeats for each mode)LUMP_INFO_MODE_COMBOS — supported mode combinationsfinishHandshake() — switch to negotiated baud rate (e.g., 115200)selectMode() — set default operating modeExample (BOOST Interactive Motor, device ID 0x26):
CMD_SELECTThis is a known hardware issue. When motors run, EMI corrupts the UART RX line.
[WARN] LUMP sync lost after N good frames (checksum expected=0xXX actual=0xYY)0xD2 bytes in discarded data (spurious detections of LEGO header byte)uartOvr=1 in parser stats — SC16IS752 FIFO overflowMotor control via M1/M2 generates high-frequency switching noise → current spikes → EMI coupling into UART RX trace → SC16IS752 FIFO fills faster than ESP32 reads via I²C.
delayMicroseconds(100) after motor speed changes (allows transients to settle)uartOvr| Priority | Fix | Expected improvement |
|---|---|---|
| 1 (best) | 68–100pF NP0/C0G ceramic cap on UART RX pin to GND | 50–70% error reduction |
| 2 | Clip-on ferrite bead on RX wire near PCB | 40–60% error reduction |
| 3 | 100Ω + 100pF RC filter on UART TX | 10–20% additional |
| 4 | 100nF decoupling cap on SC16IS752 VCC pin | standard practice |
Target: < 5 sync recoveries per minute with motor at 100% speed.
The parser (lumpparser.cpp) handles corruption gracefully:
Good state: Parser: ok=XXX csErr=0 discarded=0 recoveries=0 uartOvr=0
Watch parser stats in serial log (logged every ~5 seconds):
[INFO] logParserStats() - Parser: ok=138 csErr=0 discarded=0 recoveries=0 overflow=0 unknownSys=0 invalidSize=0 uartOvr=1
| Field | Meaning |
|---|---|
ok | Good frames parsed |
csErr | Checksum errors |
discarded | Bytes thrown away during resync |
recoveries | Number of sync-loss recovery events |
uartOvr | SC16IS752 FIFO overflow count |