need help: pci6534 stream input using ext clock

Hello,

these month I have work a lot on comedi, I want to simple job,

use NI PCI6534 to do continuous input with external clock,

I modified a example 'receiver.c' ,  the program run but cannot read any
thing in, seem no data is available in kernel space buffer.

Any experienced people give me a little hit?   thanks a million!

I just use 'gcc receiver.c -lcomedi -o  receiver'  to complie.

#define _GNU_SOURCE

#include "examples.h"

#define BUFSZ 1024
sampl_t buf[BUFSZ];

void prepare_cmd(comedi_t *dev,comedi_cmd *cmd);
void do_cmd(comedi_t *dev,comedi_cmd *cmd);

int main(int argc, char *argv[])
{
    char *fn = NULL;
    comedi_t *dev;
    comedi_cmd cmd;
    int stype;
    int ret;
    int i;

    parse_options(argc,argv);

    fn = "/dev/comedi0";
    subdevice = 0;
    channel = 0;
        n_chan=32;
        n_scan=1000;


    dev = comedi_open(fn);
    if(!dev){
        perror(fn);
        exit(1);
    }

    ret = fcntl(comedi_fileno(dev),F_SETFL,O_NONBLOCK);
    if(ret<0)perror("fcntl");

    prepare_cmd(dev,&cmd);

    do_cmd(dev,&cmd);

    return 0;
}

static int c=0;
static unsigned int bits =0;

void do_cmd(comedi_t *dev,comedi_cmd *cmd)
{
    unsigned int *chanlist;
    int n_chans;
    int total=0;
    int ret;
    int go;
    struct timeval timeout;
    fd_set rdset;

    chanlist = cmd->chanlist;
    n_chans = cmd->chanlist_len;

    ret=comedi_command_test(dev,cmd);

    printf("test1 ret=%d\n",ret);
    if(ret<0){
        printf("errno=%d\n",errno);
        comedi_perror("comedi_command_test");
        return;
    }

    //dump_cmd(stdout,cmd);

    cmd->chanlist =        chanlist;
    cmd->chanlist_len =    n_chans;

    ret=comedi_command_test(dev,cmd);

    printf("test2 ret=%d\n",ret);
    if(ret<0){
        printf("errno=%d\n",errno);
        comedi_perror("comedi_command_test");
        return;
    }

    //dump_cmd(stdout,cmd);

    cmd->chanlist =        chanlist;
    cmd->chanlist_len =    n_chans;

    ret=comedi_command(dev,cmd);

    printf("command ret=%d\n",ret);
    if(ret<0){
        printf("errno=%d\n",errno);
        comedi_perror("comedi_command");
        return;
    }

    go=1;
    while(go){
        FD_ZERO(&rdset);
        FD_SET(comedi_fileno(dev),&rdset);
        timeout.tv_sec=0;
        timeout.tv_usec=5000;
        ret = select(comedi_fileno(dev)+1,&rdset,NULL,NULL,&timeout);
        if(ret<0){
            perror("select");
        }else if(ret==0){
            if(c){
                fprintf(stderr,"\n");
                c=0;
                bits=0;
            }
        }else if(FD_ISSET(comedi_fileno(dev),&rdset)){
            ret=read(comedi_fileno(dev),buf,BUFSZ);
                       // cannot read data in,  here!!!
                      // and after run the program, it seem stop here.
                      // I have to use control + c to exit .
            if(ret<0){
                if(errno==EAGAIN){
                    go = 0;
                    perror("read");
                }
            }else if(ret==0){
                go = 0;
            }else{
                int i;

                total+=ret;
                for(i=0;i<ret/sizeof(sampl_t);i++){
                    fprintf(stderr,"%d",buf[i]>0xa000);
                    c++;
                    if(c>=32){
                        fprintf(stderr,"\n");
                        c=0;
                    }

                }
                fflush(stdout);
                fflush(stderr);
            }
        }
    }
}

unsigned int chanlist[32];

void prepare_cmd(comedi_t *dev,comedi_cmd *cmd)
{
    int i;
        memset(cmd,0,sizeof(comedi_cmd));

    cmd->subdev =        subdevice;

    cmd->start_src =    TRIG_NOW;
    cmd->start_arg =    0;

    cmd->scan_begin_src =    TRIG_EXT;  // user ext clock, should read data
at rising edge
    cmd->scan_begin_arg =    0;

 /* 0 seems the only choose, after I read the
     source code: "ni_pcidio_cmdtest.c"
     The clock pin is connect to 'PFI2' which is the pin2 on the connector,
     all the 32 data input pin are used, to read 32 bits data at one clock
rising edge. */

    cmd->convert_src =    TRIG_NOW;
    cmd->convert_arg =    0;


    cmd->scan_end_src =    TRIG_COUNT;
    cmd->scan_end_arg =    n_chan;

    cmd->stop_src =        TRIG_COUNT;
    cmd->stop_arg =        n_scan;

    cmd->chanlist =        chanlist;
    cmd->chanlist_len =    n_chan;

        for(i=0;i<n_chan;i++){
        chanlist[i]=CR_PACK(channel+i,0,0);
    }
}

Thanks!

xu min,

Shanghai Jiaotong University,   China

Received on 2006-09-21Z11:03:48