各位大侠,问题如下:
我先了个串口通信的程序,去访问一个串口设备,先写入一个16进制串,然后读,发现这时有个问题,如果我程序是deamon的,我只能读到部分数据,如果不是,我就能读到所有的数据。
主程序如下:
int main(void)
{
int fd = 0;
int nread = 0,i = 0,nwrite = 0, tmpread = 0, m = 0, n = 0 ;
char cmd_burst_data[7]={0xAA,0x55,0x11,0x00,0x00,0x77,0x77};
char recvBuf[512]={0};
char *precvBuf = recvBuf;
int xchData[50];
fd_set rd;
struct timeval timeout={0};
timeout.tv_sec=2;
timeout.tv_usec=0;
if( (fd=open_port(fd)) < 0 )
{
printf("open_port error\n");
return;
}
if( (i=set_opt(fd,19200,8,'N',1)) < 0)
{
printf("set_opt error\n");
}
while(m<3)
{
n=0;
for(i=0;i<7;i++)
write(fd,&cmd_burst_data,1);
while(n<3)
{
FD_ZERO(&rd);
FD_SET(fd,&rd);
select(fd+1,&rd,0,0,&timeout);
if(FD_ISSET(fd,&rd))
{
if(0 < (tmpread = read(fd,precvBuf,512)) )
{
for(i=0;i
{
if( (precvBuf == 0x77) && (precvBuf[i-1] == 0x77) )
goto out;
}
nread += tmpread;
precvBuf += nread;
}
}
n++;
}
m++;
}
out:
close(fd);
return;
}
以上代码可以读到完整数据,如果在main中加入 daemon(FALSE, TRUE) ,这时就无法读出完整的返回数据。
如蒙解答,不胜感激啊!
写入的数据是 0xAA,0x55,0x11,0x00,0x00,0x77,0x77
正常情况下读出的数据应该是 0xAA,0x55,0x11,0xc0,0x0d,0xc0,0x10,0x20,0x30...,0x77,0x77
deamon方式下,读到的可能是 0xAA,0x55,0x11,0xc0,0x0d,0xc0,0x10,
正常情况下,读出的数据,比如说有30个字节,一般程序会第一次读出20,第二次读出10个
但是deamon方式下,第一次可以读出20,但是再次循环读就读不到了,read返回是0,没错误返回
这个得慢慢调,感觉问题不大,可以试下read 多读几次如果返回是0的话,deamon运行时有未知情况很正常
关键没方法调。
我试了几次发现,如果连续运行这个独立程序3-5次以上,就可以读出完整的数据。 但是,我这个程序是要嵌入在一个大的deamon程序里面,大家有什么好方法可以处理呢
可以考虑再创建一个独立的线程,deamon最好不要嵌套