To control a motor from the PC you basically need to be able to tell it which direction to rotate, and when to rotate a given amount. When you're controlling stepper motors this comes down to a pin for direction and a pin for stepping. The vast majority of stepper motor controllers require these 2 inputs, a step and a direction.
This makes the parallel port a great way to communicate with motor controllers. You can manipulate the bits in the various registers (and therefore the voltages on the pins of the ports) very easily. And with the parallel port you can do this for 6, 8, even 12 output pins at the same time.
Also, the parallel port has been around for a long time, and is pretty much the same from OS to OS, and there are a lot of readily available tools to get your software to communicate with the parallel port.
With the serial port you can only manipulate the signals on one pin basically, so you move the timing and movement logic from the PC to the controller, requiring a microcontroller or some other device. This means there has to be some set of commands to communicate the movements, and without a standard communication language each set of software would have to have its own controller that spoke its language.
Same type of issues with USB, I would think. And USB seems like it would be more subject to the timing issues in Windows than the serial or parallel port.
Of course, as I write all this I'm developing a serial port stepper motor controller. Man, looking back over this I've written some pretty obvious stuff. I apologize. It's late.
Daniel
Salem Controls Inc.
http://www.salemcontrols.com/