Hello,

I have a device that sends one byte over the serial line every 10ms.

Using c, I wrote an application that opens the serial port and reads bytes in an infinite loop. I disabled all blocking (O_NONBLOCK, VMIN=0, VTIME=0, B115200). My CPU spends ~100% of its time calling read() [which almost always returns 0].

I compute the time each byte shows up using gettimeofday(). By differencing the time of successive samples, I can compute the time it took each byte to arrive. Since the bytes are transmitted at 100Hz, I expect to find that delta_time is 10ms.

For several seconds I get good results with delta_time = 10ms with a noise of ~50us

Then performance deteriorates and I get 10ms + with a noise of ~50us and a bias that cycles through 0ms, 5ms, 0ms -5ms.

Then results go back to good.

See a graph of this here (y axis is delta_timeval, x axis is time in sec):

http://img218.imageshack.us/img218/4944/plot1t.gif
http://img12.imageshack.us/img12/9693/plot2.gif
http://img10.imageshack.us/img10/5995/plot3.gif

Q: What is the source of the alternating +/- 5ms bias that comes and goes every few seconds?

Possible answers:

1. My external device is sending the bytes strangely (I don't believe this, but I can use an oscilliscope to confirm).

2. read() doesn't return within 1ms of the data coming in to the serial port.

3. gettimeofday() does not return a time good to 1ms

4. none of the above

Thank you for your help!

Chris

PS: I am using 7.2-RELEASE
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to