Python decoder for TPMS (Tire Pressure Monitoring System) USB serial receivers.
USB Receiver: Uses CH340 USB-to-Serial chip
In Windows Device Manager, the device appears as USB-SERIAL CH340.
This tool decodes tire pressure and temperature data from USB TPMS receivers. The protocol was reverse engineered from a decompiled Android APK.
pip install pyserial# List available COM ports
python tpms_decoder.py --list
# Run decoder (default 19200 baud)
python tpms_decoder.py --port COM3
# Show raw data as received
python tpms_decoder.py --port COM3 --raw
# Custom baud rate
python tpms_decoder.py --port COM3 --baud 9600The decoder shows a visual dashboard with all 4 tires + spare:
- Pressure in PSI
- Temperature in Celsius
- Status alerts (OK, Leak, Low Battery, No Signal)
Reverse engineered from Android TPMS APK (com.tpms package).
| Offset | Field | Description |
|---|---|---|
| 0 | Header | 0x55 |
| 1 | Header | 0xAA |
| 2 | Length | Total frame length |
| 3 | Command | Command type |
| 4+ | Data | Payload (varies) |
| Last | Checksum | XOR of bytes[0..length-2] |
| Offset | Field | Calculation |
|---|---|---|
| 3 | Tire ID | 0=FL, 1=FR, 16=BL, 17=BR, 5=Spare |
| 4 | Pressure | raw * 3.44 = kPa |
| 5 | Temperature | raw - 50 = Celsius |
| 6 | Status | Bit flags (see below) |
| Bit | Flag |
|---|---|
| 5 | No Signal |
| 4 | Low Power |
| 3 | Leakage |
| Cmd | Name |
|---|---|
| 0x06 | Pairing/Heartbeat |
| 0x07 | Tire Exchange |
| 0x09 | Query Sensor ID |
- Baud Rate: 19200 (default for this device)
- Data Bits: 8
- Stop Bits: 1
- Parity: None
Protocol extracted from decompiled APK classes:
FrameDecode3.java- Tire state parsingFrameEncode3.java- Command encodingPackBufferFrameEn3.java- Checksum calculation
For educational/personal use.


