自由空间
free space
<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

留言簿(22)

随笔分类

随笔档案

文章档案

相册

vckbase

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-81 文章-1 评论-228 Trackbacks-0

因在测试unix操作串口时,发现向硬件设备write指令后,read硬件返回指令时处于阻塞状态,后查阅一些资料。改成超时退出,代码如下(测试平台:Solaris):

/*
 brief:  超时读数据
 fd:  文件描述述
 lpdata:  数据指针
 timeout: 超时值(秒)
 len:  读数据长度 
*/
int ReadData(int fd,char *lp_out_data,int timeout,int len)
{
 fd_set rxset;
 int z;
 int nfds;
 struct timeval tv;
 char lpdata[RECV_MAX_DATA];
 do
 {
  FD_ZERO(&rxset);
  if(fd>=0)
   FD_SET(fd,&rxset);
  nfds = fd+1;
  tv.tv_sec=timeout;
  tv.tv_usec = 0;
  do
  {
   z = select(nfds,&rxset,0,0,&tv);
  }while(z==-1&&errno==EINTR);
  if(z == -1)
   printf("select(2)\n");
  if(z == 0)
  {
   printf("timeout\n");
   fd = -1;
  }
  
  if(fd>=0&&FD_ISSET(fd,&rxset))
  {
   memset(lpdata,0,sizeof(lpdata));
   if (len > RECV_MAX_DATA)
    len = RECV_MAX_DATA;
   z = read(fd,lpdata,len);
   if(z == -1)
   {
    printf("read(2) of fd\n");
    fd = -1;
   }
   if(z >0)
   {
    lpdata[z]=0;
    strcat(lp_out_data,lpdata);
//    printf("read %d bytes <<%02x>> from fd;\n",z,lpdata[0]);
   }
   else
   {
    printf("read EOF from fd;");
    fd = -1;
   }
  }
 }while (fd>=0);

}
推荐大家看《unix高级编程》一书。呵呵!!!!!!!!

posted on 2005-02-01 23:50 自由空间 阅读(4358) 评论(5)  编辑 收藏
Comments
  • # re: unix下超时读串口(linux下没有测试,但估计原理一样)
    周星星
    Posted @ 2005-02-02 04:04
    Solaris UNIX是最烂的UNIX版本。
  • # re: unix下超时读串口(linux下没有测试,但估计原理一样)
    freedk
    Posted @ 2005-02-02 04:31
    目前使用了,发现确实有点~~~~~~~~~
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]