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检测,但不读出来数据,肯定是无限通知你的。