long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
/**
* tiocswinsz - implement window size set ioctl
* @tty; tty side of tty
* @arg: user buffer for result
*
* Copies the user idea of the window size to the kernel. Traditionally
* this is just advisory information but for the Linux console it
* actually has driver level meaning and triggers a VC resize.
*
* Locking:
* Driver dependent. The default do_resize method takes the
* tty termios mutex and ctrl_lock. The console takes its own lock
* then calls into the default method.
*/
В коде драйверов COM-портов для Java, например в PureJavaComm, встречал очень простой способ: смотрим скорость передачи и делим на неё размер данных. Получаем время, которое нужно подождать до завершения передачи.
rs232 ну очень примитивный протокол. Передача идёт постоянно, с одной и той же скоростью, пока в буфере есть данные. И не важно, подключено ли к порту устройство, которое эти данные получает. Способа определить наличие устройства нет.
struct pollfd serial_poll;
serial_poll.fd = _fd;
while (1) {
int retval = poll(&serial_poll, 1, 10000); //ожидаем события - готовности передачи, приёма или таймаута 10 секунд
if (retval == -1) {
perror("poll()");
} else if (retval) {
if (serial_poll.revents & POLLIN) {
process_read_data();
}
if (serial_poll.revents & POLLOUT) {
process_write_data();
}
} else {
printf("No data within ten seconds.\n");
}
}
powerpc-openwrt-linux-uclibc-gcc: warning: environment variable 'STAGING_DIR' not defined