LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2320|回复: 4

请教select和read函数读取串口的时间问题

[复制链接]
发表于 2005-7-12 15:32:12 | 显示全部楼层 |阅读模式
先看这两句:
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个数,而且经过验证都是对的!不明白了。。。。。
请哪位虾给解释一下吧
发表于 2005-7-12 17:17:20 | 显示全部楼层
我觉得可能是你打开串口时对串口文件设置的属性是行缓冲的 。所以,串口只有遇到回车时才把数据发出来 。好长时间没有编程了 ,select的返回直是什么也忘记了 。但印象中select关联一个时间结构体,使其可在要求的最大时间限度中返回。
回复 支持 反对

使用道具 举报

发表于 2005-7-12 18:43:57 | 显示全部楼层
Post by friday182
先看这两句:
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个数,而且经过验证都是对的!不明白了。。。。。
请哪位虾给解释一下吧


猜测是不是Linux的非实时特性引起的,第一个字节发送到达,引起中断,
Linux有驱动要处理中断,然后还有调度,每个系统调用也要花时间,这些
时间加起来,20个字节估计早就传完了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-13 11:22:33 | 显示全部楼层
我用下面这个程序测试了一下:
           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:%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代替了,使之成为阻塞读取
回复 支持 反对

使用道具 举报

发表于 2005-7-13 13:44:52 | 显示全部楼层
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));

这样的话你看看是多少时间?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表