1

Hi I am writing a C program to interface a serial device which gives data at regular intervals, i need to look for the inputs at the serial port at regular intervals. this can be done by a ' read' function . but i dont know how to call it frequently at fixed time intervals ?

Ramakrishna
  • 163
  • 3
  • 9
  • `read()` should return immediately if there is anything to be read. If you really need to poll, you can change the file descriptor to non-blocking mode, or `poll()` the file descriptor with a `0` timeout. If you really need regular intervals, you will need an interval timer. – jxh Feb 25 '14 at 03:15

2 Answers2

1

This sort of behavior short-circuits the lovely machinery built in to most OSes to do just this, failing that something like cron would seem to be a lovely option. Failing all of that (if you're just looking for a quick hacky option) busy wait is not super awesome, the system isn't bright enough to hyperthread around that so your program winds up eating up a core doing nothing for the duration of your program, so while it's largely a matter of taste, I'm a nanosleep man myself. on nix/nux systems:

    #include <time.h>

    int main(void)
    {
       struct timespec sleepytime;
       sleepytime.tv_sec = seconds_you_want_to_sleep
       sleepytime.tv_nsec = nanoseconds_you_want_to_sleep
       while( !done)
       {
          nanosleep(&sleepytime, NULL); 
          //do your stuff here
       }
       return 0;
    } 

if you're worried about getting interrupted, the second parameter should be another timespec struct, in which will be stored the amount of time remaining, check if == 0, then keep on trucking.

in windows apparently it is a little easier.

    #include <windows.h>

    int main(void)
    {
       while( !done)
       {
          Sleep(milliseconds_you_want_to_sleep); 
          //do your stuff here
       }
       return 0;
    } 

Unfortunately I don't run windows so I haven't been able to test the second code sample.

joshbooks
  • 489
  • 3
  • 8
0

If you really need to read at regular intervals ( and not just poll for data to be available ) , you can do something like this :

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>

void timer_handler (int signum)
{
 static int count = 0;
 printf ("timer expired %d times\n", ++count);
}

int main ()
{
 struct sigaction sa;
 struct itimerval timer;

 /* Install timer_handler as the signal handler for SIGVTALRM. */
 memset (&sa, 0, sizeof (sa));
 sa.sa_handler = &timer_handler;
 sigaction (SIGVTALRM, &sa, NULL);

 /* Configure the timer to expire after 250 msec... */
 timer.it_value.tv_sec = 0;
 timer.it_value.tv_usec = 250000;
 /* ... and every 250 msec after that. */
 timer.it_interval.tv_sec = 0;
 timer.it_interval.tv_usec = 250000;
 /* Start a virtual timer. It counts down whenever this process is
   executing. */
 setitimer (ITIMER_REAL, &timer, NULL);

 /* Do busy work. */
 while (1);
}

I copied this from http://www.informit.com/articles/article.aspx?p=23618&seqNum=14 and changed the timer type, effectively you are setting up an interval timer and handling the signal when the timer runs out.

eerpini
  • 85
  • 3
  • 1
    This code was copied into [another question](https://stackoverflow.com/questions/54750876/understanding-output-of-program), in which the OP asks *why it does not work*. And indeed it doesn't work. – John Bollinger Feb 18 '19 at 15:56