The normal sequence is to sent the AT command (don't forget to send the CR (0x0d) ... then do the Read. There is a cool trick that most people don't know: If your read request is for 100 bytes, there is no return until you get 100 bytes. So, how do you know how much to request?
Use ClearCommError ( http://msdn.microsoft.com/en-us/library/aa363180(VS.85).aspx ) and check COMSTAT.cbInQueue to find out how many bytes there are to read.
Send the AT command. Wait a half second, then check for incoming data, then read that data.
For background, see:
Serial Communications in Win32
http://msdn.microsoft.com/en-us/library/ms810467.aspx
however, I do not recommend using overlapped ID or even COMM events - that always just confused the issue for me. With a modem , you send a command, then read the response. Very straight forward.
-- Dan