Доброго дня!
По работе в «наследство» досталась тестовая прога под МСВС для модуля с интерфейсом RS-232. Режим работы порта 8N1, без контроля четности, скорость 115200.
В процедуре записи в порт после вызова write идёт следующая конструкция:
write ( fd, buf, len );
do
{
usleep(1);
ioctl ( fd, TIOCSERGETLSR, &status );
} while (!(status & TIOCSER_TEMT));
status |= TIOCM_RTS;
ioctl ( fd, TIOCMBIC, &status );
return 0;
Так как тест запускается на персоналке, то usleep (1) на поверку выливается в паузу 20 мс (судя по всему, минимальный тик таймера), что является слишком долгим интервалом при работе с модулем. Попробовал закомментить usleep, в результате RTS выставляется ранее, чем успевают передаться данные, и последний байт данных теряется.
Попробовал вместо do-while использовать tcdrain(fd) – та же история с потерей последнего байта. Совместное использование tcdrain и затем do-while выливается в задержки переменной длины 5…13 мс, что тоже слишком долго.
Вот пытаюсь понять, что же сделать, чтобы RTS сбрасывался вовремя, а не слишком рано или чрезмерно поздно =)