Надо было сразу написать, что SmBatt_SerialPortWrite() вызываешь из DPC.
DPC выполняются на DISPATCH_LEVEL, а там ждать нельзя (например, вызовом KeWaitForSingleObject).
Другими словами, этот вызов у тебя должен быть асинхронным (а результат будет в функции завершения).