The base OBD2 readers only read the common codes. Many can't read the full BMW codes. If you can afford to spend the time to learn how to setup and use it, the BMW GT1 software for a PC is best (or the newer variants). Get the cable and 20pin adapter online for like $40, and "find" the software elsewhere.

If you just want to scan and reset basic codes, the Peake reader is really the way to go.