日期:2014-05-16  浏览次数:21009 次

Linux 串口select机制
求大神指导。。
用select对串口进行读写操作   与轮询和中断的方法区别是什么呢?
while(1)
{
    FD_ZERO(&rd);
    FD_SET(fd,&rd);
    tv.tv_sec = 2;
    tv.tv_usec = 0;
    printf("Plc1");
    switch(select(fd+1,&rd,NULL,NULL,&tv))
    { 
         case 0:printf("Plc2");break;
         default:printf("Plc3");
    }
    break;//****** 
}
在上面这段代码里如果等待超时的2sec,为什么Plc1是和Plc2同时出现在终端上呢?按照顺序执行不应该Plc1先出现再等待一段时间Plc2才显示吗?

另外如果把****处的break去掉,若无串口操作,在终端上不显示Plc1也不显示超时的结果Plc2这是为什么呢?
------解决方案--------------------
用printf()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。

1. 使用fflush(stdout)强制刷新。
2.缓冲区已满。
3.scanf()要在缓冲区里取数据时会先将缓冲区刷新。
4.\n,\r进入缓冲区时。
5.线程结束的时候,如果该线程里也有printf(....);
6. 程序结束时。

最简单的方法,就是加个\n
------解决方案--------------------
你只select检测,但不读出来数据,肯定是无限通知你的。