CAN DATA Discrepancy Between UNO & MEGA

I suspect the real culprit is CPU overload—Serial.print() is surprisingly expensive in time. To pinpoint exactly how long your routines take, try this low-overhead timing method:

Scope-based timing

    Pick an unused digital pin and hook it up to your oscilloscope.

    In code, set that pin HIGH at the very start of the function you want to time, and LOW when it finishes.

    The oscilloscope will display a pulse whose width is the exact execution time, without the extra overhead of millis() or similar.

Alleviate CAN bus congestion

    Add a second CAN node running at the same bit rate, but deliberately insert small delays (gaps) between messages.

    If performance improves, you know bus saturation or arbitration delays are part of the problem.

Validate your physical bus layout

    Sketch a simple diagram showing the OBD port at one end, all your devices, and the location of each 120 Ω termination resistor.

    Confirm your wiring and terminations match the CAN specification—misplaced or missing terminators can introduce errors and retransmissions that eat CPU time.

By combining precise scope-based timing with controlled message spacing and a clean bus schematic, you’ll be able to identify whether it’s really processor load, bus congestion, or wiring/termination issues causing your troubles.