Linux, Uart, tcdrain

Gast #2809332
Lesenswert?

Bei einer kontinuierlichen Ausgabe von 150 Byte Bloecken auf 
/dev/ttyUSB0 mit 57600,8,n,1 und anschliessender Pause ist mir folgendes 
aufgefallen:

Vatiante1: (length=150)

while(42)
{
  if ( write ( fd, s, length) != length)
  {
    printf ( "send failed" );
    exit(2);
  }
  while ((tcdrain(fd) < 0) && (errno == EINTR));
  usleep(50000);
}

Variante2:

while(42)
{
  for(i=0;i<150;i++)
  {
    if ( write ( fd, &c, 1) != 1)
    {
      printf ( "send failed" );
      exit(2);
    }
  }
  while ((tcdrain(fd) < 0) && (errno == EINTR));
  usleep(50000);
}

Variante1 funktioniert wie erwartet:

       150Bytes         50ms Pause         150Bytes         50ms Pause
ssssssssssssssssssssss--------------ssssssssssssssssssssss-------------- 
...

Variante2 hat fast keine Pause:

       150Bytes                150Bytes
ssssssssssssssssssssss--ssssssssssssssssssssss--...


Warum wartet Variante2 vor dem tcdrain nicht, bis das letzte Zeichen 
gesendet worden ist?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren