PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : select hat nur ms Auflösung?



nobody0
09-01-2005, 02:11
In einem Programm, dass Daten über eine Serielle Schnittstelle empfängt, überprüfe ich die Zeit, die zwischen zwei Bytes vergeht:



for (;;) // receive the bytes one by one
{
memset (&timeout, 0, sizeof (timeout));
timeout.tv_sec = 5; // seconds
FD_ZERO (&readfs);
FD_SET (fd, &readfs);
if (0 != select (maxfd, &readfs, NULL, NULL, &timeout))
{
read (fd, &buffer[n], 1);
if ((buffer[n] & 0xf0) == 0xe0 || (16 <= n))
break;
// check if the time from Byte n-1 to n is not too great; the data packet must be defragmented
if (n++)
{
i = timeout.tv_usec + timeout.tv_sec * 1000000; // time left
i = 5000000 - i; // receive time
if (i > i_deadline)
{
fprintf (stderr, "Received data packet fragment: Receive time (in µs) %d > deadline %d, Byte %d.\n", i, i_deadline, n);
n = 0; // nothing valid received
usleep (50000); // wait 50 ms
tcflush (fd, TCIFLUSH); // flush input buffer
continue; // restart receiving
}
}
if (1 == n) // start time counter for reading data
{
timeval0 = get_time (NULL);
// check if the leap to the last data packet was long enough
lli_rec_time = timeval0 - timeval1;
if (lli_rec_time < 100000) // less than 100 ms leap
{
fprintf (stderr, "Too small leap between the data packets: Only %lld µs.\n", lli_rec_time);
n = 0; // nothing valid received
usleep (50000); // wait 50 ms
tcflush (fd, TCIFLUSH); // flush input buffer
}
}
}
else
{
fprintf (stderr, "Connection timeout (select failed).\n");
}
}


und das Problem ist, dass es bei höheren Datenraten ausgibt,dass die Zeit zwischen zwei Daten-Paten zu groß ist und zwar ein ganzzahliges Vielfaches von 1000 µs, selbst bei 4 Megabit/s!
Woran kann es liegen, dass nur ein ganzzahliges Vielfaches von 1000 µs vom select ausgegeben wird? :confused: