Para dispositivos tty
, você deve usar tcdrain()
no descritor de arquivo.
Eu preciso sincronizar um valor de pino de E / S com uma gravação em uma porta serial do espaço do usuário (porque ainda não consegui fazer isso a partir do espaço do kernel - consulte my outra pergunta ). Meu código (deixando de fora a verificação de erros) é o seguinte:
char buf[3] = {'U','U','U'};
int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY); // supposed to be blocking
// fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK); <-- makes no difference
FILE *f = fopen("/sys/class/gpio/gpio200/value", "w"); // the relevant IO
// set IO
fprintf(f, "1");
fflush(f);
// send data
write(fd, buf, sizeof(buf));
// unset IO
fprintf(f, "0");
fflush(f);
O comportamento é que o IO é rapidamente alternado para 1 e vice-versa no início da gravação. Em outras palavras, write()
retorna muito antes de os dados serem realmente colocados no fio.
Existe alguma esperança aqui?
Para dispositivos tty
, você deve usar tcdrain()
no descritor de arquivo.