fre 2009-03-27 klockan 13:58 +0100 skrev Ladislav Vaiz:
>
> Hi Jonatan,
> I use my own wrapper around ftdi_read_data. It returns immediately when
> error occur or any amount of data is read. Timeout should be measured
> with good precision.
> Lada
>
> int my_ftdi_read(struct sconn *sconn, void *data, size_t len, int
> timeout_ms){
> int ret;
> struct timeval start, stop;
> int usec, sec;
>
> gettimeofday(&start, NULL);
> while(1){
> ret = ftdi_read_data(sconn->ftdi, data, len);
> if (ret) break;
> gettimeofday(&stop, NULL);
> usec = stop.tv_usec - start.tv_usec;
> sec = stop.tv_sec - start.tv_sec;
> if (usec<0) usec+=1000000,sec--;
> if (sec>timeout_ms/1000) break;
> if (usec/1000>timeout_ms) break;
> usleep(1000);
> }
> return ret;
> }
>
>
Hi,
That consumes a little more CPU than I was hoping for, but I will do
something similar.
Btw, what are you doing with usec there? I don't think your code will
work with a timeout of 1200 ms for example: usec will never reach
12000000, so it will exit when sec > timeout_ms/1000, that is after 2
seconds.
I do it like this:
...
gettimeofday (&stop, NULL);
ms = (stop.tv_usec - start.tv_usec) / 1000;
ms += (stop.tv_sec - start.tv_sec) * 1000;
if (ms > timeout_ms)
break;
...
Oh, I didn't know about that comma-separated list of expressions syntax
you're using (usec+=1000000,sec--), nice!
Regards,
Jonatan Magnusson
--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx
|