I think I figured it out. For some reason, I need to add a delay before flushing. These two lines added before returning fd seem to have done the trick:
sleep(2); //required to make flush work, for some reason
tcflush(fd,TCIOFLUSH);
--- оттуда-же ---
The cause of this problem lies in using a USB serial port. If you use a regular serial port, you will not have this problem.
Most USB serial port drivers don't support flushing properly, probably because there's no way of knowing if there's still data in the internal shift register, FIFO or in the USB subsystem.
See also Greg's reply to a similar problem reported earlier here.
Your sleep may cure the problem, but it's only a work-around. Unfortunately there is no solution other than using a regular serial port.
[свернуть]