您好我正在编写一个C程序来连接一个定期提供数据的串行设备,我需要定期查看串口的输入。这可以通过'读'功能来完成。但我不知道如何经常以固定的时间间隔来呼叫它?
答案 0 :(得分:1)
这种行为使大多数操作系统内置的可爱机器短路,这样做就像cron这样的东西似乎是一个可爱的选择。失败了所有这些(如果你只是在寻找一个快速的hacky选项)忙碌的等待并不是超级棒,系统不够明亮,无法绕过那个,所以你的程序最终吃掉了一个没有做任何事情的核心。你的节目,所以虽然它主要是品味问题,但我自己也是一个纳米睡眠的人。 在nix / nux系统上:
#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;
}
如果您担心中断,第二个参数应该是另一个timespec结构,其中将存储剩余的时间量,检查是否== 0, 然后继续卡车运输。
在Windows中,显然它更容易一些。 #include <windows.h>
int main(void)
{
while( !done)
{
Sleep(milliseconds_you_want_to_sleep);
//do your stuff here
}
return 0;
}
不幸的是我没有运行Windows,所以我无法测试第二个代码示例。
答案 1 :(得分:0)
如果你真的需要定期阅读(而不只是轮询数据可用),你可以这样做:
#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);
}
我从http://www.informit.com/articles/article.aspx?p=23618&seqNum=14复制了这个并改变了计时器类型,实际上你设置了一个间隔计时器并在计时器用完时处理信号。