Sabendo quando um write () em uma porta serial terminou de transmitir dados

0

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?

    
por user907323 31.08.2018 / 10:00

1 resposta

2

Para dispositivos tty , você deve usar tcdrain() no descritor de arquivo.

    
por 31.08.2018 / 14:23