Folgendes steh zwar nicht zur debatte, ist für mich aber auch suspekt:
case READ_VBATT:
LOG(PROTOCOL, "Reading battery voltage");
*(unsigned long*)pOutput = 143 * 100;

Aber um da weiter zu kommen, würde ich das ganze mal in sofern simulieren, dass ich ein Programm schreibe, das deine Funktion aufruft.
Dann kannst du das ganze leicht debuggen unds schaun was ankommt und gegebenfalls in der Funktion den Code anpassen.

Gruß