блок чтения последовательного порта ttyUSB0 при использовании libev

У меня есть последовательный порт ttyUSB0, и я открываю его с помощью NONBLOCK.

fd = open(args_info.dev_arg, O_RDWR | O_NONBLOCK);

использование read немедленно вернется, все в порядке. Но при использовании libev

ev_io_init(&serial->recv_ctx->io, serial_recv_cb, fd, EV_READ);

serial_recv_cb будет блокировать до 100 байт. если длина данных меньше 100 байт, serial_recv_cb никогда не будет вызываться.

[root@jane client]# ./tcptrans --dev /dev/ttyUSB0 -d 7 --nic wlp2s0
serial.c +163 serial_recv_cb(): DEBUG: fd: 5, size: 100
serial.c +163 serial_recv_cb(): DEBUG: fd: 5, size: 100

Я думаю, что serial_recv_cb будет называться немедленным. Почему libev будет блокировать?


person jianxi sun    schedule 16.04.2018    source источник
comment
А ваш вопрос....?   -  person Mathieu    schedule 16.04.2018
comment
Почему libev не вызывает немедленный вызов serial_recv_cb?   -  person jianxi sun    schedule 16.04.2018
comment
Он не должен выполнять никаких обратных вызовов, пока вы не вызовете ev_run.   -  person stark    schedule 16.04.2018
comment
Какие настройки termios вы задали для последовательного порта?   -  person Ian Abbott    schedule 16.04.2018


Ответы (1)


termios имеют VMIN и VTIME. Мой VMIN установлен на 100, а VTIME равен 0. Поэтому будет ждать до 100 байт.

person jianxi sun    schedule 17.04.2018