The Saddlers' top scorer Troy Deeney, who had netted the opening goal, was sent off with 13 minutes of normal time to go when he apparently said something to the referee after receiving a yellow card for a foul, and was promptly shown a red.
Referee Andy Haines had angered the home fans and the Saddlers throughout a match in which he handed Charlton a controversial penalty that brought them back into the game just before half-time.
Walsall had taken the lead on 32 minutes when Deeney headed his 10th of the season from a cross by teenage defender Darryl Westlake.
But Charlton, who have taken only two points from their last three matches against struggling teams, were awarded a penalty on 45 minutes when Akpo Sodje went down in the box, although home defender Jamie Vincent had appeared to win the ball cleanly. Deon Burton hammered home the spot-kick to equalise.
Charlton without a win in three matches, dominated the second half on a muddy pitch but Walsall, now without a win in seven games, defended bravely and in the last minute of normal time Alex Nicholls broke through the middle but Rob Elliot dived to his left to keep out his effort.