I agree with most of what Gadgetman! said, except the bit about handshaking. There is no in-band signalling from the host to GRBL, and the signalling from GRBL to the host does not eat into the bandwidth of the other direction. In practice, UARTs often work with no overhead at all, at the theoretical speed (115,200 bps in this case). With 8 bit encoding, no parity, and 1 stop bit, that's 10 bit periods per character, or 11,520 cps, or 46 characters per 4 ms interval. That's enough to keep GRBL's buffer full.
FargoPhil wrote:I have the impression there is no flag to change the planner's assumptions about what's beyond the buffer. So that idea was a dead end.
There can't be one. The planner can not make any assumptions about what's beyond the end of the buffer: the only safe behavior is to plan to stop at the end.
If there was such a flag, what would happen at the end of your code? Execute last G-code command in your file assuming machine will continue to move full-speed, then no command comes. What now?
Even if you don't use the assumption unless the buffer is full, you still have a problem. You have 18 moves left. You're at X = 38.2 mm moving full speed east. You need to stop at X = 40 mm. How do you do that? Same problem if the 18th move (the one not yet in the planner buffer) is a sharp corner that can't be taken at full speed, or even after 1.7 mm worth of braking.