В коде драйверов COM-портов для Java, например в PureJavaComm, встречал очень простой способ: смотрим скорость передачи и делим на неё размер данных. Получаем время, которое нужно подождать до завершения передачи.
rs232 ну очень примитивный протокол. Передача идёт постоянно, с одной и той же скоростью, пока в буфере есть данные. И не важно, подключено ли к порту устройство, которое эти данные получает. Способа определить наличие устройства нет.
Ну а размер буфера указать можно, так же как и и узнать переданы ли все данные из буфера. Сказать какие ioctl использовать, к сожалению, не могу. Но разобраться довольно легко. Для примера, как это делается, можно заглянуть в код
PureJavaComm — там есть соответствующие вызовы.