Zebra is pretty dirt simple if you aren't dynamically creating the label layout and whatnot (while having the flexibility to create a label from scratch via code). Without upgrading to a print system with its own controls, I don't imagine you'll find anything easier. If all you are doing is passing a number to generate a bar-code or, even simpler, indexing through serial numbers to make bar-codes, you may be able to find a printer with discrete IO that can do bit codes so you can avoid comms all together (I think Zebra even has models that do this).
I do agree that the way they return certain status information in a big long string that you have to parse without including unique characters to parse from is pretty bad. I'm also not a huge fan of ZPL, but with a guide in front of you, it's pretty easy to figure out what commands to send.
Reaching back into the dark recesses of my memory to my first Zebra, I think I tested commands out from a PC (using RealTerm for serial and writing a little C# program to test Raw socket communication on ethernet). That will at least tell you if the command you are trying to send is the right one and show you what, if anything is coming back from the printer.