Code is in the "trunk" on the google project webpage, enjoy
opengauge - Google Code
My car seems to use protocol 6, CAN 11 bit 500KBaud.
For your speed problem I don't know, by default the timeout on the ELM is 20 seconds or something like this and it sends a '?'.
I use a string like "0101\r" and send it in a while() loop and serialWrite(), take a look at the code. There is no tricky part, I don't use timers, I just read/write in the serial port.
BTW I did all the programmation of the ELM327 using their spec available in the ELM327DS.pdf file.
EDIT: to convert the hex in num, I use strtoul(). Also I kept the ELM at 9600 bauds, I don't want to flood my CAN bus, and I don't need to get more than 10 PIDs per second anyway.