Problem solved. It turns out that node red keeps deleted communication nodes running, unless you not only remove them from the flow (essentially the program you design), but from the whole editor. I deleted the Arduino nodes, and everything connects reliably now.
The old Arduino serial nodes (designed to interface with firmata on an Arduino) were interfering with the generic serial nodes I was using for input / output.
The above C++ code works great. It receives a servo command as <pin number,movement> and writes that to the servos. It reads sensor values and formats them as JSON and writes them to the serial port, so they can be parsed and distributed as desired by the receiver.