- 论坛徽章:
- 0
|
我现在写了一个串口接收数据的程序,想让它在后台执行,接收串口通讯时发过来的数据,但是当发送端发数据出来后,后台执行的串口接收数据的程序无法收到数据,每次都是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)
{
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;
} |
|