标题: 请教select和read函数读取串口的时间问题
先看这两句:
temp=select(fdcom+1,&fs_read,NULL,NULL,NULL);
if(temp){
len=read(fdcom,str,20);
}
我从单片机向串口发送20个字节,1200bps,理论上发送20字节要用1/1200*10*20=0.167s
由于VMIN=1;我的理解是串口buffer里面收到一个字节select就返回了,这个时候执行read的时间大约是200us,但是20个字节还没有完全存入buffer,应该读不到20个数才对呀!
以前我都在read前加入延时,今天发现不加延迟也一样可以读出20个数,而且经过验证都是对的!不明白了。。。。。
请哪位虾给解释一下吧
====================================================
我觉得可能是你打开串口时对串口文件设置的属性是行缓冲的 。所以,串口只有遇到回车时才把数据发出来 。好长时间没有编程了 ,select的返回直是什么也忘记了 。但印象中select关联一个时间结构体,使其可在要求的最大时间限度中返回。
==================================================
猜测是不是Linux的非实时特性引起的,第一个字节发送到达,引起中断,
Linux有驱动要处理中断,然后还有调度,每个系统调用也要花时间,这些
时间加起来,20个字节估计早就传完了。
==================================================
我用下面这个程序测试了一下:
temp = select (fdCom + 1, &fs_read, NULL, NULL, NULL);
if (temp)
{
gettimeofday(&time_p7,NULL);
len = read(fdCom, str, 13);
gettimeofday(&time_pp7,NULL);
printf("after get 13 bytes command use time:%d ld\n",(time_pp7.tv_sec*1000000 + time_pp7.tv_usec)-(time_p7.tv_sec*1000000 + time_p7.tv_usec));
结果是:
after get 13 bytes command use time:37 us
after get 13 bytes command use time:17 us
after get 13 bytes command use time:19 us
after get 13 bytes command use time:18 us
这个就是read函数执行的时间,都是微妙级的。应该不是楼上说的那样吧。
回2楼的:
我是用单片机发送到pc串口的数据,没有回车符。select是可以设置一个timeout的timeval,我这里用NULL代替了,使之成为阻塞读取
==========================================================
gettimeofday(&time_p7,NULL);
temp = select (fdCom + 1, &fs_read, NULL, NULL, NULL);
if (temp)
{
len = read(fdCom, str, 13);
gettimeofday(&time_pp7,NULL);
printf("after get 13 bytes command use timeld\n",(time_pp7.tv_sec*1000000 + time_pp7.tv_usec)-(time_p7.tv_sec*1000000 + time_p7.tv_usec));
这样的话你看看是多少时间?
==========================================================
文章评论(0条评论)
登录后参与讨论