How to connect a serial (RS-232) wideband controller to the EvoScan Port 4.0 through a MAX3232 module, which gauge to switch on in the dashboard, and how to read the Wideband menu’s status line when nothing shows up.
The short version: three wires from the module to the XIAO ESP32-S3: module VCC to 3V3, module GND to GND, and the module’s receive output (usually the pin marked RXD) to D0. The wideband’s serial-out wire goes into the module’s RS-232 input (DB9 pin 3) and its serial ground to the module’s ground (DB9 pin 5). Nothing goes to D1, and nothing is sent back to the wideband: the Port only listens.
Which route does your wideband use?
| Your wideband | Route | MAX3232 needed? |
|---|---|---|
| AEM OBD-II CAN X-Series: 30-0333 or 30-0334, its CAN pair on the steering-column CAN pair | CAN, plain 11-bit, at the gauge’s default settings: it answers OBD-II PID 0x24 requests at 0x7E6. Enable AEM OBD-II CAN X-Series 30-0333 / 30-0334 AFR (CAN pair, not the D0 serial wire; 30-0300 / 30-0310 use their serial wire instead). Details in the next section. |
No |
| AEM UEGO 30-4100 / 30-4110, the AEM X-Series 30-0300 / 30-0310 serial wire, AEM Inline 30-2310, Innovate LC-1 / LC-2 / MTX-L / LM-2 / LM-1, Zeitronix Zt-2 / Zt-3, PLX iMFD, AutoMeter and Stack Pro Plus | Serial, through the MAX3232 into D0. This page. | Yes |
| Any wideband with a 0-5 V analogue output, on an Evo X or Ralliart | Analogue. Wire the output to the engine ECU’s rear O2 input and enable Rear O2 Wideband; nothing connects to the Port itself. |
No |
AEM OBD-II CAN X-Series: 30-0333 or 30-0334
The one wideband Port 4.0 reads over CAN is AEM’s OBD-II CAN X-Series: the 30-0333 gauge kit or the 30-0334. It needs no MAX3232 and no serial wire. Port 4.0 polls it the way the EvoScan Windows software has since 2022, over plain 11-bit CAN at 500 kbit/s: the gauge answers OBD-II PID 0x24 requests at 0x7E6 and replies from 0x7EE.
- Wire the AEM gauge’s CAN pair (AEMnet+ / CAN-H and AEMnet- / CAN-L) to the same steering-column CAN pair as the Port 4.0, beside the Port’s own taps. Do not wire or plug it into the OBD-II port: on the Evo X that connector is on the other side of the ETACS gateway, and the Port’s requests never reach it. AEM’s own instructions plug the gauge into the OBD-II port, which is why a gauge fitted that way shows nothing in EvoScan.
- Leave the gauge at its default OBD-II settings. Port 4.0 supports the defaults only: ECU #6 (0x7E6), PID O2 #1 (0x24), 11-bit IDs, 500 kbps. A gauge set to another ECU #, another PID or 29-bit IDs is never answered.
- Tick
AEM OBD-II CAN X-Series 30-0333 / 30-0334 AFR (CAN pair, not the D0 serial wire; 30-0300 / 30-0310 use their serial wire instead)in the Wideband group. The Wideband menu then counts the replies; “no reply” with the gauge powered means the wrong bus or changed settings. - The standard X-Series 30-0300 gauge and 30-0310 inline broadcast AEMnet instead, which Port 4.0 does not read. Those two connect through their blue serial wire and the MAX3232, exactly as described below.
What you need
- A MAX3232 RS-232 to TTL module, about $2 from any electronics supplier. It must be a MAX3232, the 3.3 V part. A MAX232 module is 5 V only: it will not run from 3.3 V, and its output would put 5 V into the Port, which the ESP32-S3 pins are not rated for. The common type has a DB9 socket on one end and a four-pin header (VCC, GND, TXD, RXD) on the other; the bare type has a header on each side. Either works.
- Three short lengths of hook-up wire, heat-shrink and a soldering iron.
- The wideband’s serial-out wire and its serial ground (the table in step 3 names them for each controller), or the wideband’s PC data cable plus a male-to-male null-modem adapter.
- Optional: a multimeter, for the checks in the troubleshooting section.
Power the module from the XIAO’s 3V3 pin
Module VCC to the XIAO’s 3V3 pin, module GND to a XIAO GND pin. Not the 5V pin: the MAX3232’s output swings all the way up to its supply voltage, and the ESP32-S3’s inputs are 3.3 V parts. At 3.3 V the module still makes its own RS-232 voltages internally (that is what the four small capacitors on it are for), so nothing is lost.
Module output to D0
The module has two data pins on its TTL side. One is the receiver’s output: the RS-232 data from the wideband, turned into 3.3 V logic. That pin goes to the XIAO’s D0 pin (GPIO 1). On most DB9 modules it is the pin marked RXD, meaning “connect this to your receiver”. The other pin, usually marked TXD, is an input into the module: a D0 wired there never sees a byte. Leave it unconnected.
Labels vary between modules, and nothing is damaged by trying the other pin. If the Wideband menu shows 0 bytes in step 5, move the D0 wire to the other data pin. With a multimeter you can settle it first: the pin you want has continuity to pin 12 (R1OUT) of the MAX3232 chip. The chip pinout is in the troubleshooting section.
D0 is the top-left pin of the XIAO with the USB-C socket at the top. Solder the wire to the top of the header pin where it comes through the XIAO board. The CAN breakout board underneath does not use D0. D1, next to it, is not used by the wideband at all.
Wideband serial wire to the module’s RS-232 input
The wideband’s serial-out wire goes to the module’s receiver input, the MAX3232’s R1IN. On a module with a DB9 socket that is DB9 pin 3, and the wideband’s serial ground goes to DB9 pin 5. Pin 2 is the module’s own output: a wire put there is never read. On a bare module use the RS-232-side pin that leads to chip pin 13 (R1IN), with the ground pin beside it.
The module’s DB9 socket is wired to plug straight into a PC’s COM port: it listens on pin 3, where a PC talks, and talks on pin 2, where a PC listens. A wideband is also built to plug into a PC, so its data cable puts the data on pin 2 of its own plug. Plug that cable straight into the module and you have two talkers on pin 2 and nobody listening. Either put a male-to-male null-modem adapter (one part, it swaps pins 2 and 3) between the cable and the module, or skip the cable and solder the data wire straight onto the module’s pin 3 pad and the ground onto pin 5. The soldered way is also the neater install.
The grounds must be shared. Run the wideband’s serial ground (or its power ground) to the module’s ground, which is the Port’s ground. A wideband grounded only to the chassis somewhere else usually still works in a car, but a dedicated ground wire to the module is the reliable way.
Where each controller’s serial output is
| Controller | Serial out | Serial ground | Notes |
|---|---|---|---|
| AEM UEGO 30-4100 / 30-4110 gauge | BLUE wire | the gauge’s BLACK ground; run a wire from the same ground point to the module | AFR or lambda follows the gauge’s switch; the Port handles both. |
| AEM X-Series 30-0300 / 30-0310 | BLUE wire, harness pin 5 “Serial / RS-232 Output” | gauge ground | Their AEMnet CAN output is not read by Port 4.0: the serial wire is the route for these two. The OBD-II models 30-0333 / 30-0334 go on CAN instead, see the section above. |
| AEM Inline 30-2310 | GREY wire | controller ground | 19200 baud. |
| Innovate LC-1 | OUT port, 2.5 mm stereo jack: the ring carries serial out, the sleeve is ground; the tip is serial IN. Confirm with a meter (the data contact reads negative volts at idle). | jack sleeve | Fit the terminator plug in the IN port, as for PC logging. |
| Innovate LC-2, MTX-L, LM-2 | OUT port, 4-pin Molex. Innovate cable p/n 3812 (Molex to 2.5 mm) gives you the same ring and sleeve as above. | jack sleeve | Nothing in the IN port. Do not plug or unplug the serial ports while the unit is powered. |
| Innovate LM-1 | Its PC serial cable: DB9 pin 2 = data | DB9 pin 5 | Needs the null-modem adapter, or move the two wires to the module’s pins 3 and 5. |
| Zeitronix Zt-2, Zt-3 | DATA port through the supplied RJ-12 to DB-9 plug: DB-9 pin 2 = data | DB-9 pin 5 | Use the supplied plug, not the RJ-12 pins directly: the DATA port also carries power for Zeitronix displays. Data starts 6 s (2010 model) or 15 s (2009) after power-up. |
| PLX iMFD (SM-AFR) | 2.5 mm jack serial output | jack sleeve | Some PLX units output TTL levels: if the status line counts breaks, tick the invert switch. |
| AutoMeter Pro Plus, Stack Pro Plus | VIOLET wire “Serial Out” | VIOLET/BLACK wire “Serial Ground” | Sends “htg” while the sensor heats, then one reading per line. |
Switch on the gauge that matches the controller
Open the dashboard and its parameter list, tap the Wideband filter button, and tick the AFR gauge for your device. One only: the gauge selects the device’s protocol and baud rate, and the last one ticked wins.
| Controller | Gauge to tick | Baud |
|---|---|---|
| AEM UEGO 30-4100 / 30-4110, AEM X-Series on the serial wire | AEM X-Series / 30-4100 UEGO Serial 9600 AFR | 9600 |
| AEM Inline 30-2310 | AEM Inline 30-2310 Serial 19200 AFR | 19200 |
| Innovate LC-1, LC-2, MTX-L, LM-2 | Innovate LC-1/LC-2/MTX-L/LM-2 AFR (ISP2) | 19200 |
| Innovate LM-1 | Innovate LM-1 AFR (ISP1) | 19200 |
| Zeitronix Zt-2 model 2009 | Zeitronix Zt-2 (2009) AFR | 9600 |
| Zeitronix Zt-2 model 2010, Zt-3 | Zeitronix Zt-2/Zt-3 (2010) AFR | 9600 |
| PLX iMFD (SM-AFR) | PLX iMFD AFR | 19200 |
| AutoMeter Pro Plus, Stack Pro Plus | AutoMeter (Stack) Pro Plus AFR | 9600 |
Do not tick AEM OBD-II CAN X-Series 30-0333 / 30-0334 AFR (CAN pair, not the D0 serial wire; 30-0300 / 30-0310 use their serial wire instead) for a wideband on the serial wire. That gauge polls the CAN bus
and the serial input stays closed. The same goes for Rear O2 Wideband, which reads the engine ECU, not D0.
Read the Wideband menu
Tap the Wideband button again to open its menu. It shows the active source and the latest AFR, and under them a status line for the serial input that refreshes every two seconds. (If your menu has no status line, your firmware predates it: update from the dashboard first.) With everything right and the wideband warmed up, it reads something like this:
The bytes and packets counters are the quickest wiring test you have. They count from the moment the gauge is enabled, so a bytes counter that stays at 0 means D0 is not seeing the wideband’s data at all, and a packets counter that stays at 0 while bytes arrive means the device is not the one the gauge expects. Anything other than “Receiving and decoding” is covered in the troubleshooting section below.
Troubleshooting
Common mistakes
- D0 on the wrong module pin. D0 is taken from the module’s TXD-marked pin (an input) instead of the RXD-marked one, the receiver’s output (R1OUT). Move it to the other pin. Nothing is harmed either way.
- The wideband’s wire on DB9 pin 2 instead of pin 3. Pin 2 is the module’s output; the receiver input (R1IN) is pin 3. A PC data cable plugged straight into the module makes exactly this mistake, which is what the null-modem adapter is for.
- No shared ground. The wideband’s serial ground must reach the module’s GND, which is the Port’s GND. Without it the receiver has nothing to measure the signal against and the counters stay at 0 or fill with junk.
- The wrong gauge is on.
AEM OBD-II CAN X-Series 30-0333 / 30-0334 AFR (CAN pair, not the D0 serial wire; 30-0300 / 30-0310 use their serial wire instead)polls the CAN bus and leaves D0 closed, so doesRear O2 Wideband. Tick the serial gauge for your device instead, and only that one. - 5 V on the module. VCC on the XIAO’s 5V pin runs the module at 5 V and feeds 5 V logic into D0. Move it to 3V3. A module built around a MAX232 rather than a MAX3232 cannot run at 3.3 V at all; replace it.
- The wideband is not sending yet. Every controller streams only after its warm-up: a Zeitronix starts its data 6 to 15 seconds after power, an Innovate sends warm-up and calibration status first, an AutoMeter sends “htg” while heating. Give it a minute with the engine running before judging the wiring.
- Innovate IN port. An LC-1 streaming to a logger needs its terminator plug in the IN port; an LC-2, MTX-L or LM-2 wants nothing connected to IN. The data comes out of the OUT port.
- Two gauges ticked. Only one serial source can be open. The last gauge ticked wins; untick the others.
What the status line means
| The status line says | What is happening | What to do |
|---|---|---|
| “AEM OBD-II CAN X-Series (30-0333 / 30-0334): 0 replies from 0x7EE. No reply yet …” | The OBD-II CAN gauge is on and nothing answers 0x7E6; D0 is closed. | For a serial wideband, tick its serial gauge (AEM X-Series / 30-4100 UEGO Serial 9600 AFR for an X-Series on its serial wire). For the OBD-II gauge, check its CAN pair is on the steering-column pair and its settings are the defaults. |
| “Serial input not in use: this gauge is the engine ECU’s rear O2 input …” | Rear O2 Wideband is on; D0 is closed. | Tick your device’s serial gauge. |
| “Serial input not in use: enable the one serial AFR gauge …” | No serial gauge is ticked. | Tick one (step 4). |
| “The serial port on D0 is not open” | The device could not start its serial port. | Reboot the device. If it persists, press “Upload diagnostic log now” on the dashboard’s Admin page and contact support. |
| 0 bytes, no breaks | D0 sees a quiet line: nothing is driving it. | Wiring. RXD not TXD on D0 (step 2), pin 3 not pin 2 (step 3), VCC on 3V3 and GND on GND, grounds shared, wideband powered and past its warm-up. |
| 0 bytes, breaks counting | Something drives D0 but it idles low: a TTL-polarity output through the module. | Tick “Invert the serial RX signal” in the same menu and give it a few seconds. |
| bytes, 0 packets, frame errors or breaks | The bit timing is off: the wrong baud rate for the device, or the wrong polarity. | Tick the gauge that matches the device. If it already does, try the invert switch. |
| bytes, 0 packets, no errors | Clean bytes, but in another device’s protocol. | Tick the gauge that matches the device. The last bytes in brackets say which it is: B2 8x headers are Innovate, 00 01 02 Zeitronix, 80 .. 40 PLX, digits with a dot and 0D 0A an AEM or AutoMeter line. |
| packets, but no AFR | Decoding fine; the device has no reading yet. | Wait for the warm-up. The text above the status line shows the Innovate warm-up or calibration state, or the AutoMeter’s “htg” / “rdy”. |
| “Receiving and decoding” | Working. | Nothing. |
Checks with a multimeter
- Module VCC to GND: 3.2 to 3.4 V with the Port powered.
- Wideband serial-out wire to ground, wideband powered: a steady negative voltage, about -5 to -12 V, is an RS-232 line idling and is what you want. 0 V means the wideband is not sending or you have the wrong wire. A steady +3 to +5 V means a TTL-polarity output: wire it the same way and tick the invert switch.
- The module pin on D0, to ground: about 3.3 V at idle. 0 V at idle with the wideband connected means the polarity is inverted (invert switch) or you are on the wrong pin.
- Continuity, module unpowered: the header pin you put on D0 must connect to chip pin 12 (R1OUT); the DB9 pin 3 pad must connect to chip pin 13 (R1IN).
If it still does not work
Contact EvoScan support with the exact text of the Wideband menu’s status line, the name of the gauge you ticked, the wideband make and model, and a photo of the module’s wiring at both ends. Those four things identify nearly every case in the table above without a second round of questions.
Questions
Can I use D1 instead of D0?
No. The serial input is D0 (GPIO 1) only. D1 is not connected to anything in the firmware, so a wire there is never read.
Does the Port send anything to the wideband?
No. The input is receive-only, which is why the module’s TXD pin stays open. The old Windows software’s LC-1 recalibrate command is not part of the Port.
Do I need the invert switch?
Not for any controller in the tables above: they all drive a PC COM port, and the MAX3232 delivers the right polarity to D0. The switch is for a device with a TTL-level serial output (some PLX units), and the status line tells you when that is the case.
Can I log two widebands?
One serial source at a time. A second wideband can come in over CAN (an AEM OBD-II CAN X-Series 30-0333 / 30-0334 on the Port’s CAN pair) or, on an Evo X or Ralliart, through the engine ECU’s rear O2 input with its 0-5 V analogue output.
AFR or lambda?
An AEM or AutoMeter gauge sends whichever it is displaying; a value below 3.0 is taken as lambda and multiplied by 14.7. Innovate and Zeitronix packets are decoded to AFR at 14.7.
The reading drops out when the engine starts.
The wideband restarts during cranking and heats up again. The Port keeps running, so the gauge comes back on its own when the stream resumes.