I tested your code but before I inserted a bit more debugging output. I wrote every byte I received to the debugging serial and so I found several problems in your code. First of all: your interpreting a fixed protocol but the ELM 327 does communicate some errors too. The delays are absolutely no help, they just impose problems. But the good news are: the ECU responded to your code and from time to time it even got the correct speed and RPMs.
If you wanna go on with your car display you should definitely take a look at the OBDuino code. I took it as a base for my own code and got everything running in much less time than it would have needed if I wrote everything myself.
The debugging is not easy, I have to install my netbook in my car, connect everything together, start the car and see what's happening on the serial terminal. All this is taking place in the basement, four floors lower.
This is the log of the initialization and first value requests of the OBDuino code in my car:
elm_write: (ATWS^M)
elm_read: (ELM327 v1.3a)
elm_write: (ATE0^M)
elm_read: (ATE0OK)
elm_write: (0100^M)
elm_read: (SEARCHING...41 00 BE 3F A8 13 )
elm_write: (0100^M)
elm_read: (41 00 BE 3F A8 13 )
elm_write: (ATDPN^M)
elm_read: (A7) -> 4137
elm_write: (ATSHDA10F1^M)
elm_read: (OK)
elm_write: (0100^M)
elm_read: (41 00 BE 3F A8 13 )
elm_write: (0120^M)
elm_read: (41 20 80 1D B0 11 )
elm_write: (0140^M)
elm_read: (41 40 7A D0 00 00 )
elm_write: (010C^M)
elm_read: (41 0C 00 00 )
elm_write: (010C^M)
elm_read: (41 0C 00 00 )