Paul Benson and Jason Euell scored either side of the break on Tuesday night, although the hosts had to hold on for their upset win as Sean Morrison pulled a goal back before Mathieu Manset saw a shot cleared off the line.
Ruben Bover Izquierdo hit the woodwork late on after a mazy run for the Addicks but it mattered not as they celebrated their progress.
Reading could have taken the lead in the opening minute and only Yado Mambo’s vital touch prevented Manset converting Jobi McAnuff’s cross.
Benson and Danny Green both squandered chances for the Addicks before Manset saw a header scrambled off the line at the other end by Cedric Evina.
Charlton broke the deadlock in the 25th minute when Euell’s flicked header was capitalised on by Benson, who beat Royals goalkeeper Alex McCarthy to the ball before firing home from close range.
The home side should have been two up five minutes later after Bradley Pritchard’s lob beat McCarthy and looked certain to hit the back of the net until Shaun Cummings somehow got back to clear off the line.
New Charlton goalkeeper Ben Hamer, who was making his debut against his former club, made a fine stop to prevent Ben Howard scoring direct from a corner three minutes before the break.
Reading came close to getting back on terms in the 48th minute when Simon Church got on the end of McAnuff’s inviting delivery but he headed over the crossbar.
McCarthy had to be alert to keep out Green’s corner before Charlton doubled their lead on 64 minutes when Euell headed home Simon Francis’ cross.
The visitors reduced the arrears nine minutes later after Morrison met McAnuff’s corner before firing in a shot through a crowded penalty area.
Manset was only denied an 80th-minute equaliser when his header was cleared off the line by substitute Scott Wagstaff.
However, it was Charlton who came close to adding a third four minutes from time when Ruben Bover Izquierdo went on a great run before unleashing a shot which beat McCarthy but hit the crossbar.