⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ul_lcscan.c

📁 一个linux下rs485驱动程序的源代码
💻 C
字号:
/*******************************************************************  uLan Communication - simple test client  ul_lcscan.c	- procceed wavelength scanning with LCD5000  (C) Copyright 1996,1999 by Pavel Pisa   The uLan driver is distributed under the Gnu General Public Licence.   See file COPYING for details. *******************************************************************/#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <stdio.h>#include <getopt.h>#include <errno.h>#include <sys/types.h>#include <sys/time.h>#include <sys/stat.h>#include <math.h>#include <string.h>#include <ctype.h>#include <ul_lib/ulan.h>#ifdef _WIN32#define sleep Sleep#endif/*******************************************************************/char *ul_dev_name = UL_DEV_NAME;int module= 3;int prt_modules= 0;int debugk     = 0;int debugk_flg = 0;int wl_begin   = 200;int wl_end     = 300;int wl_step    = 1;int wl_pause   = 1000;int zero_fl    = 0;int time_co_fl = 0;int time_co    = 0;int adc_chan_fl= 0;int adc_chan   = 0;int lampctrl_fl= 0;int lampctrl   = 0;int oi_var_fl  = 0;int oi_var_rd  = 0;char *oi_var_aoid=NULL;char *oi_var_val=NULL;int oi_var_oiddes_print(int oid, uchar *despack){  char *desname=uloi_oiddespack_strdup(despack,0);  char *destype=uloi_oiddespack_strdup(despack,1);  if(desname){    printf(" %5d deslen=%d name=\"%s\" type=\"%s\"\n",           oid,despack[0],desname?desname:"",destype?destype:"");  }else{    printf(" %5d\n",oid);  }  if(desname) free(desname);  if(destype) free(destype);  return 0;}int oi_var_test(char *aoid, char *valin, char **valout, char *type){  int ret;  int oid;  int val;  int vallen=2;  int i;  uloi_coninfo_t *coninfo;  coninfo=uloi_open(ul_dev_name,module,0x10,0,10);  if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;};  if((aoid!=NULL)&&(*aoid))  {    if(isdigit(*aoid))    { oid=strtol(aoid,NULL,0);    }    else    { ret=uloi_get_aoiddes(coninfo,oi_var_rd?ULOI_DOIO:ULOI_DOII,aoid,NULL);      if(ret<0)       { fprintf(stderr,"oi_var_test : uloi_get_aoiddes returned %d\n",ret);        return -1;      };      oid=ret;    }    if(valout==NULL&&!oi_var_rd)    { if(valin&&*valin)      { val=strtol(valin,NULL,0);      }      else vallen=0;      ret=uloi_set_var(coninfo,oid,&val,vallen);      if(ret<0) { fprintf(stderr,"oi_var_test : uloi_set_var failed\n");return -1;};    }    else    { ret=uloi_get_var(coninfo,oid,&val,vallen);      if(ret<0) {fprintf(stderr,"oi_var_test : uloi_get_var failed\n");return -1;};      if(val&0x8000) val|=~0xffff; else val&=0xffff;      printf("%s=%d\n",aoid,val);    }  }  else  { int *oids;    ret=uloi_get_oids(coninfo,ULOI_QOII,&oids);    if(ret<0)     { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);      return -1;    };    printf("module recognized commands and set vars:\n");    for(i=0;i<ret;i++)    { uchar *despack=NULL;      if(uloi_get_oiddes(coninfo,ULOI_DOII,oids[i],&despack)>=0){        oi_var_oiddes_print(oids[i],despack);        if(despack)	  free(despack);      }else{        printf(" %5d no reply\n",oids[i]);      }    }    free(oids);    ret=uloi_get_oids(coninfo,ULOI_QOIO,&oids);    if(ret<0)     { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);      return -1;    };    printf("module recognized get vars:\n");    for(i=0;i<ret;i++)    { uchar *despack=NULL;      if(uloi_get_oiddes(coninfo,ULOI_DOIO,oids[i],&despack)>=0){        oi_var_oiddes_print(oids[i],despack);        if(despack)	  free(despack);      }else{        printf(" %5d no reply\n",oids[i]);      }    }    free(oids);  }  uloi_close(coninfo);  return 0;}int print_modules(int max_addr){ int ret;  int i;  ul_fd_t ul_fd;  uchar *p;  void *buf=NULL;  int buf_len;  int count=0;   ul_fd=ul_open(ul_dev_name, NULL);  if(ul_fd==UL_FD_INVALID)    { perror("print_modules : uLan open failed");return -1;};  for(i=1;i<=max_addr;i++)  {    ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,  			UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);    if(ret>=0)    { count++;      p=(uchar*)buf;      for(ret=0;(ret<buf_len)&&*p;ret++,p++);      printf("%2d:  ",i);      fwrite(buf,ret,1,stdout);      printf("\n");    };    if(buf) free(buf);    buf=NULL;  };  ul_close(ul_fd);  return count;};int debug_kernel(int debug_msk){ int ret;  ul_fd_t ul_fd;  ul_fd=ul_open(ul_dev_name, NULL);  if(ul_fd==UL_FD_INVALID) { perror("send_cmd_go : uLan open failed");return -1;};  ret=ul_drv_debflg(ul_fd,debug_msk);  ul_close(ul_fd);  return ret;};float IEEE4tofloat(void *p){ uchar *up=p; long mantisa; int exponent; mantisa=up[0]|((unsigned)up[1]<<8)|         ((unsigned long)up[2]<<16)|0x800000; if(up[3]&0x80) mantisa=-mantisa; exponent=(up[2]>>7)|(((int)up[3]&0x7f)<<1); return ldexp((float)mantisa,exponent-0x7f-23);};uchar test_cmd[]={0,0,0,204,0,234,0,20,0,204,0,0,0};int wl_set_wlen(uloi_coninfo_t *coninfo,unsigned wlen){ unsigned u;  int ret;  ret=uloi_set_var_u2(coninfo,204,wlen);  if(ret<0) return ret;  while(1)  { sleep(1);    ret=uloi_get_var_u2(coninfo,204,&u);    if(ret<0) return ret;    if(u==0x8000) continue;    if(u&0x8000) return -1;    if(u!=wlen) return -1;    return wlen;  }}int wl_scan(void){  int ret;  ul_fd_t ul_fd;  ul_msginfo msginfo;  uloi_coninfo_t *coninfo;  uchar  buf[10];  struct timeval timeout;  unsigned wlen;  fd_set set;  float  abs;  coninfo=uloi_open(ul_dev_name,module,0x10,0,10);  if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;};    if(time_co_fl)  { uloi_set_var_u2(coninfo,208,time_co);  }  if(adc_chan_fl)  { uloi_set_var_u2(coninfo,209,adc_chan);  }  if(lampctrl_fl)  { uloi_set_var_u2(coninfo,207,lampctrl);  }  wlen=wl_begin;  if(!wl_step) wl_end=wlen;  if(((wl_begin<=wl_end)&&(wl_step>=0))   ||((wl_begin>=wl_end)&&(wl_step<0))) while(1)  { ret=wl_set_wlen(coninfo,wlen);    fprintf(stderr,"ul_set_wlen returned %d\n",ret);    sleep(wl_pause/1000);    if(zero_fl)    { ret=uloi_send_cmd(coninfo,255);      fprintf(stderr,"uloi_send_cmd returned %d\n",ret);        }    ret=uloi_get_var(coninfo,220,buf,4);    fprintf(stderr,"uloi_get_var returned %d\n",ret);    printf("%d %f\n",wlen,IEEE4tofloat(buf));        if((wlen==wl_end)||!wl_step) break;    wlen+=wl_step;    if(((wl_step>0)&&(wlen>wl_end))     ||((wl_step<0)&&(wlen<wl_end))) wlen=wl_end;  }  uloi_close(coninfo);  return 0;  ul_fd=ul_open(ul_dev_name, NULL);  if(ul_fd==UL_FD_INVALID) { perror("wl_scan : uLan open failed");return -1;};  memset(&msginfo,0,sizeof(msginfo));  msginfo.sadr=module;  msginfo.cmd=UL_CMD_LCDABS;  ret=ul_addfilt(ul_fd,&msginfo);  if(ret<0) { printf("wl_scan : add filter failed\n");return ret;};  msginfo.cmd=UL_CMD_LCDMRK;  ret=ul_addfilt(ul_fd,&msginfo);  if(ret<0) { printf("wl_scan : add filter failed\n");return ret;};  for(;;)  {  #ifndef WITHOUT_SYS_SELECT    FD_ZERO (&set);    FD_SET (ul_fd2sys_fd(ul_fd), &set);    FD_SET (0, &set);    timeout.tv_sec = 10;    timeout.tv_usec = 0;    while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1            &&errno==-EINTR);    if(FD_ISSET(0,&set))      {printf("\nwl_scan : break by user\n");break;};    if(ret<0) return ret;    if(!ret) continue;  #else /* WITHOUT_SYS_SELECT */    while (ul_fd_wait(ul_fd,1)<=0);  #endif /* WITHOUT_SYS_SELECT */    ret=ul_acceptmsg(ul_fd,&msginfo);    if(ret<0)     { printf("wl_scan : problem to accept message\n");      return ret;    };    if(msginfo.flg&UL_BFL_FAIL)       {ul_freemsg(ul_fd);continue;};    if(msginfo.cmd==UL_CMD_LCDABS)    { while((ret=ul_read(ul_fd,buf,4))==4)      {        abs=IEEE4tofloat(buf);        printf("%9.6f\n",abs);      };    }else     if(msginfo.cmd==UL_CMD_LCDMRK)    {             memset(buf,0,sizeof(buf));      ul_read(ul_fd,buf,4);      printf("MARK %d %d\n",buf[0],buf[1]);    };    ul_freemsg(ul_fd);  };  ul_close(ul_fd);  uloi_close(coninfo);  return 0;};static voidusage(void){  printf("usage: ul_lcabsp <parameters> <hex_file>\n");  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");  printf("  -m, --module <num>       messages from/to module\n");  printf("  -p, --print  <max>       print modules to max address\n");  printf("      --debug-kernel <m>   flags to debug kernel\n");  printf("  -b, --begin  <wlen>      initial wavelength\n");  printf("  -e, --end    <wlen>      final wavelength\n");  printf("  -s, --step   <wlen>      wavelength step\n");  printf("  -z, --zero               zero absorbance\n");  printf("  -t, --time-const <s>     ADC filter time constant\n");  printf("  -c, --adc-chan <c>       imput chanel of ADC\n");  printf("  -l, --lamp  <l>          lamp control\n");  printf("  -o, --oi-var <oid>=<v>   uLan OI variable set\n");  printf("  -o, --oi-var <oid>?      uLan OI variable read\n");  printf("  -V, --version            show version\n");  printf("  -h, --help               this usage screen\n");}int main(int argc,char *argv[]){  static struct option long_opts[] = {    { "uldev", 1, 0, 'd' },    { "module",1, 0, 'm' },    { "print", 1, 0, 'p' },    { "version",0,0, 'V' },    { "help",  0, 0, 'h' },    { "debug-kernel", 1, 0, 'D' },    { "begin", 1, 0, 'b' },    { "end",   1, 0, 'e' },    { "step",  1, 0, 's' },    { "pause", 1, 0, 'P' },    { "zero",  0, 0, 'z' },    { "time-const", 1, 0, 't' },    { "adc-chan", 1, 0, 'c' },    { "lanmp", 1, 0, 'l' },    { "oi-var",1, 0, 'o' },    { 0, 0, 0, 0}  };  int  opt;  char c; #ifndef HAS_GETOPT_LONG  while ((opt = getopt(argc, argv, "d:m:p:Vhb:e:s:P:zt:c:l:o:")) != EOF) #else  while ((opt = getopt_long(argc, argv, "d:m:p:Vhb:e:s:P:zt:c:l:o:",			    &long_opts[0], NULL)) != EOF) #endif    switch (opt) {    case 'd':      ul_dev_name=optarg;      break;    case 'm':      module = strtol(optarg,NULL,0);      break;    case 'p':      prt_modules = strtol(optarg,NULL,0);      break;    case 'D':      debugk = strtol(optarg,NULL,0);      debugk_flg=1;      break;    case 'V':      fputs("uLan lcscan v0.7\n", stdout);      exit(0);    case 'b':      wl_begin = strtol(optarg,NULL,0);      break;    case 'e':      wl_end = strtol(optarg,NULL,0);      break;    case 's':      wl_step = strtol(optarg,NULL,0);      break;    case 'P':      wl_pause = strtol(optarg,NULL,0);      break;    case 'z':      zero_fl=1;      break;    case 't':      time_co_fl=1;      time_co=strtod(optarg,NULL)*100;      break;    case 'c':      adc_chan_fl=1;      adc_chan=strtol(optarg,NULL,0);      break;    case 'l':      lampctrl_fl=1;      lampctrl=strtol(optarg,NULL,0);      break;    case 'o':      oi_var_fl=1;      oi_var_rd=0;      oi_var_aoid=optarg;      oi_var_val=strpbrk(optarg,":=?");      if(oi_var_val)      { c=*oi_var_val;        *(oi_var_val++)=0;        switch(c)        { case '?':	    oi_var_val=NULL;	    oi_var_rd=1;            break;        }      }      break;    case 'h':    default:      usage();      exit(opt == 'h' ? 0 : 1);    }  if(debugk_flg) debug_kernel(debugk);  if(prt_modules) print_modules(prt_modules);    if(oi_var_fl) oi_var_test(oi_var_aoid,oi_var_val,NULL,NULL);    if(!debugk_flg&&!prt_modules&&!oi_var_fl)    wl_scan();  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -