Lukeyson gives a good description of the landscape for devices that connect to the vehicle. I suppose that a rough breakdown in the ways these devices can be used might be:
1) sending and receiving messages to/from controllers on a vehicle's network(s) to do things like sense events and device states (e.g. OBD data, gear selection, etc.), and to actuate certain devices (e.g. door locks, mirrors, etc.)
2) reprogramming or "reflashing" controller software or calibrations to improve performance, fuel economy, emissions, etc.
As Lukeyson says, not all devices do both (1) and (2). The J2534 spec allows for both capabilities (1) and (2), though I don't think all J2534 devices implement both capabilities. I don't believe devices like the ELM are capable of (2), but I may be wrong.
Overall, especially for (1), I'd generally recommend J2534-compliant devices (e.g. the Mongoose from
http://www.drewtech.com, the ValueCAN {CAN-only} from
http://www.intrepidcs.com, etc.) for reasons of performance, stability and programmability. The ELM is nice because of it's relative ease-of-use and support for all the common vehicle networks, but it has performance limitations (especially on CAN networks), cannot "do" multiple networks simultaneously (apparently), and limited filtering ability. And although the ELM is easier to use "manually" (i.e. typing commands in a serial-connected terminal emulator, such as hyperterm), the ELM is actually more clumsy to do robust programming against vs. against a J2534-compliant device (my opinion). The truth is, although it is nice to have a single device that supports all network types (such as the ELM), I think you would only benefit from that versatility if you used the device among multiple vehicles. But on any
given vehicle, you typically would *not* have more than CAN and/or one other network (e.g. J1850VPW, J1850PWM, ISO9141, ISO14230, etc.) for which the Mongoose design is sufficient (i.e. CAN + one other network). For vehicles that have multiple CAN networks, you'd typically need multiple devices whether you used a Mongoose/ValueCAN-class device or an ELM-class device (although there are more high-end J2534-compliant devices which support multiple CAN networks, their cost is high-end as well).
I cite devices such as the Mongoose, ValueCAN and ELM above, but there are certainly other devices out there on the market (e.g. VMSpc, MBD3200SE as mentioned in this thread, etc.). I just don't have any experience with them, so I can't opine one way or the other.
As an aside, you might have seen in another post to this forum ("
An easier way to write software that interacts with your vehicle"), which describes how the Cardix programming platform insulates you from these vehicle-connection hardware programming differences (among other benefits). Your application is only concerned with the data it wants, not how to talk to the vehicle connection device(s).