免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1419 | 回复: 1
打印 上一主题 下一主题

串口接收数据的应用程序后台运行后无法接受到数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-18 20:19 |只看该作者 |倒序浏览
我现在写了一个串口接收数据的程序,想让它在后台执行,接收串口通讯时发过来的数据,但是当发送端发数据出来后,后台执行的串口接收数据的程序无法收到数据,每次都是select超时。换成前台执行后就没有任何问题,这是为什么呢?困扰了我很久了!

接收数据的函数:

int readport(int fd, char *buf, int len)
{
fd_set readfds;
char tmpbuf[64];
int ret = 0,size = 0;
char *ppos = NULL;
struct timeval time;
ppos = 0;
len=1;
size=0;  
DPRINTF("readport\n");
while (len)//||(tdGetTickCount() - dwTimer)>3000)
{
  FD_ZERO(&readfds);
  FD_SET(fd, &readfds);
  time.tv_sec = 1;    //SECOND
  time.tv_usec = 0;  //USECOND
  ret = select(fd + 1, &readfds, NULL, NULL, &time);
  if (ret <0)
  {
   DPRINTF("Select error\n");
   ret=-2;
   break;
  }
  else if (ret == 0)
  {
   DPRINTF("Select time out\n");
   ret=-1;
   break;   
  }
  
  usleep(1*1000);
     
  while ((ret = read(fd, tmpbuf, len)) > 0)
  {
   //根据串口协议修改代码
   if (size == 0&&(tmpbuf[0] == (char)0xe7))
   {
    ppos = buf;
    *ppos++ = 0xe7;
    len = 1;
    size=1;
   }
   else if (ppos&&(buf[0] == (char)0xe7)&& size ==1)               
   {
    *ppos++ = tmpbuf[0];
    len = tmpbuf[0] - 2;
    size++;
   }
   else if (ppos && (buf[0] == (char)0xe7) && size == 2)
   {
    memcpy(ppos,tmpbuf,ret);
    ppos+=ret;
    len-=ret;
    size+=ret;
   }
   
   if (len == 0)
   {
    break;
   }
  }
  if(size&&ret<=0)
  {
   DPRINTF("time out,size =%d\n",size);
  }
}

DPRINTF("\n5555===size====%d\n", size);
return size;//ret + 1;
}

论坛徽章:
0
2 [报告]
发表于 2009-06-18 23:52 |只看该作者
你是怎么让他后台执行的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP