请教:deamon 的一个串口通信程序为什么不能读出完整的数据?

icove   2009-12-8 09:42 楼主
各位大侠,问题如下:
我先了个串口通信的程序,去访问一个串口设备,先写入一个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)  ,这时就无法读出完整的返回数据。

如蒙解答,不胜感激啊!

回复评论 (7)

有没有其它线程接着啊?
点赞  2009-12-8 09:58
你的部分数据是什么意思?是读到哪些?丢了哪些?
点赞  2009-12-8 11:55
写入的数据是                 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,没错误返回
点赞  2009-12-8 13:57
这个得慢慢调,感觉问题不大,可以试下read 多读几次如果返回是0的话,deamon运行时有未知情况很正常
点赞  2009-12-9 09:12
关键没方法调。
我试了几次发现,如果连续运行这个独立程序3-5次以上,就可以读出完整的数据。 但是,我这个程序是要嵌入在一个大的deamon程序里面,大家有什么好方法可以处理呢
点赞  2009-12-9 09:54
没用过,顶上去。等待高手解决。
点赞  2009-12-9 10:45
可以考虑再创建一个独立的线程,deamon最好不要嵌套
点赞  2009-12-9 13:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复