linux 串口数据读取阻塞问题

xiaoyao18301 2010-06-18 09:54:19
问题描述:再linux下通过串口实现对传感器状态的查询和数据的接受 疑惑通常可以通过select机制实现对串口读写的阻塞 在实现对传感器状态查询的过程中 需要每个状态的逐次查询 也就是 发送第一个状态查询命令 然后读取传感器反馈 如果正确 继续发送第二个状态的查询命令 这个时候 就会涉及到读取数据时的阻塞问题 我再每次读取过程时都通过select机制对同一个串口进行阻塞,想每次读取反馈数据时阻塞5秒 否则超时退出 可是运行效果并不是如此 所以求助 有什么其他方法满足此需求吗
...全文
1680 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyao18301 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 caballeroo 的回复:]

引用 9 楼 xiaoyao18301 的回复:
FD_ZERO(&rd);

FD_SET(fd,&rd);
while(1){
if(select(fd+1,&amp;rd,NULL,NULL,&amp;tm)<0)
perror("select");
else{
if(FD_ISSET(fd,&amp;rd)){
i……
[/Quote]
不是不能break;是第二次直接退出了
Caballeroo 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaoyao18301 的回复:]
FD_ZERO(&rd);

FD_SET(fd,&rd);
while(1){
if(select(fd+1,&rd,NULL,NULL,&tm)<0)
perror("select");
else{
if(FD_ISSET(fd,&rd)){
if((nread = read(fd, buff, 8)) == 8)
{
printf(……
[/Quote]




你运行之后,break了能不退出吗?

xiaoyao18301 2010-06-22
  • 打赏
  • 举报
回复
FD_ZERO(&rd);

FD_SET(fd,&rd);
while(1){
if(select(fd+1,&rd,NULL,NULL,&tm)<0)
perror("select");
else{
if(FD_ISSET(fd,&rd)){
if((nread = read(fd, buff, 8)) == 8)
{
printf("nread=%d,%s\n",nread,buff);
break;
}
}
printf("timeout\n");
}

break;
}


FD_ZERO(&rd);

FD_SET(fd,&rd);
while(1){
if(select(fd+1,&rd,NULL,NULL,&tm)<0)
perror("select");
else{
if(FD_ISSET(fd,&rd)){
if((nread = read(fd, buff, 8)) == 8)
{
printf("nread=%d,%s\n",nread,buff);
break;
}
}
printf("timeout\n");
}

break;
}
可是当第一次运行完毕后 第二次直接就是timeout退出了
raley29 2010-06-21
  • 打赏
  • 举报
回复
select不能实现你要的要的效果?具体的说说效果怎么不好?实际的结果是什么样的?
xiaoyao18301 2010-06-21
  • 打赏
  • 举报
回复
按照此方式 循环读取传感器传来的数据
xiaoyao18301 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 raley29 的回复:]
select不能实现你要的要的效果?具体的说说效果怎么不好?实际的结果是什么样的?
[/Quote]

我的做法是这样的
FD_ZERO(&readfd);
FD_SET(fd,&readfd);
while(FD_ISSET(fd,&readfd)){
if(select(fd+1,&readfd,NULL,NULL,&tm)<0)
perror("select");
else{
while((read(fd,rec_buf, 4)) == 4){
//进行处理
}
}
}

hancker 2010-06-18
  • 打赏
  • 举报
回复
我的想法用信号来触发..sigsuspend 和相应的信号处理函数来控制..
jnzw1986 2010-06-18
  • 打赏
  • 举报
回复
我也在看串口的东东。。脑袋快砸裂了。。。
Caballeroo 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaoyao18301 的回复:]
问题描述:再linux下通过串口实现对传感器状态的查询和数据的接受 疑惑通常可以通过select机制实现对串口读写的阻塞 在实现对传感器状态查询的过程中 需要每个状态的逐次查询 也就是 发送第一个状态查询命令 然后读取传感器反馈 如果正确 继续发送第二个状态的查询命令 这个时候 就会涉及到读取数据时的阻塞问题 我再每次读取过程时都通过select机制对同一个串口进行阻塞,想每次读取反馈数据时阻塞5……
[/Quote]


就这个问题,你的想法可以达到理想的效果,至于不对,可能问题出在其他地方!


串口要设置成非阻塞型,fcntl()设置。



again:select(,,,,,5s){

if(){

}
else if{

}
....
else if(){
goto again;
}

}
teng0210 2010-06-18
  • 打赏
  • 举报
回复
设置非阻塞读写
alarm设置超时
捕获SIGALRM信号处理超时
ForestDB 2010-06-18
  • 打赏
  • 举报
回复
帮顶。

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧