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

📄 ul_dysn.c

📁 一个linux下rs485驱动程序的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************  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. *******************************************************************/#define _GNU_SOURCE#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 <string.h>#include <ctype.h>#include <time.h>#include <ul_lib/ulan.h>#if !defined( __GNUC__)||defined(DJGPP)||defined(NO_GET_DELIM)||defined (__MINGW32__)int getdelim(char **line,size_t *linelen,char delim,FILE *F){ char c; int  l=0; do{  if(l+2>=*linelen)  {   *linelen=l+20;   if(!*line) *line=(char *)malloc(*linelen);    else *line=(char *)realloc(*line,*linelen);  }  c=fgetc(F);  if(feof(F)) {if(l) break; else return -1;}  if(c!='\r') (*line)[l++]=c; } while(c!=delim); (*line)[l]=0; return l;};#endif/*******************************************************************/int ul_new_memrq_head(ul_fd_t ul_fd, int dadr, int cmd,                       int mtype, int start, int len){  int ret;  int i;  ul_msginfo msginfo;  uchar buf[8];  msginfo.dadr=dadr;  msginfo.cmd=cmd;  msginfo.flg=UL_BFL_ARQ|UL_BFL_PRQ|UL_BFL_M2IN;  ret=ul_newmsg(ul_fd,&msginfo);  if(ret<0) return ret;  i=0;  buf[i++]=(uchar)mtype; buf[i++]=mtype>>8;  buf[i++]=(uchar)start; buf[i++]=start>>8;  if(mtype&0x100)    {buf[i++]=start>>16; buf[i++]=start>>24;};  buf[i++]=(uchar)len;   buf[i++]=len>>8;  if(ul_write(ul_fd,buf,i)!=i)  { ul_abortmsg(ul_fd);    ret=-1;  };  return ret;};int ul_new_memrq_read(ul_fd_t ul_fd, int dadr,                      int mtype, int start, int len){  int ret;  ul_msginfo msginfo;  ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_RDM,mtype,start,len);  if (ret<0) return ret;  msginfo.dadr=dadr;  msginfo.cmd=UL_CMD_RDM&0x7F;  msginfo.flg=UL_BFL_REC|UL_BFL_LNMM|UL_BFL_M2IN;  msginfo.len=len;  ret=ul_tailmsg(ul_fd,&msginfo);  if (ret<0) {ul_abortmsg(ul_fd);return ret;};  ret=ul_freemsg(ul_fd);  return ret;};int ul_new_memrq_write(ul_fd_t ul_fd, int dadr,                       int mtype, int start, int len, void *buf){  int ret;  ul_msginfo msginfo;  ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_WRM,mtype,start,len);  if(ret<0) return ret;  msginfo.dadr=dadr;  msginfo.cmd=UL_CMD_WRM&0x7F;  msginfo.flg=UL_BFL_SND|UL_BFL_LNMM|UL_BFL_ARQ|UL_BFL_M2IN;  msginfo.len=len;  ret=ul_tailmsg(ul_fd,&msginfo);  if(ret<0) {ul_abortmsg(ul_fd);return ret;};  if(buf)  { ret=ul_write(ul_fd,buf,len);    if(ret<0) {ul_abortmsg(ul_fd);return ret;};    ret=ul_freemsg(ul_fd);  };  return ret;};int ul_mem_read_wait(ul_fd_t ul_fd, int dadr,                     int mtype, int start, int len, void *ptr){  int ret, stamp;  ul_msginfo msginfo;   stamp=ret=ul_new_memrq_read(ul_fd,dadr,mtype,start,len);  if(ret<0) return ret;  /* ioctl(ul_fd,UL_KLOGBLL); */  /* ioctl(ul_fd,UL_STROKE); */  do {    ul_freemsg(ul_fd);    ret=ul_fd_wait(ul_fd,20);    if(ret<0) {printf("Select returned %d\n",ret);return ret;};    if(!ret) {printf("Select - timeout\n");return -1;};    ret=ul_acceptmsg(ul_fd,&msginfo);    if(ret<0)    { printf("Accept msg returned %d\n",ret);      return ret;    };  } while(msginfo.stamp!=stamp);  if(msginfo.flg&UL_BFL_FAIL)   { printf("Failed msg flg=0x%X\n",msginfo.flg);    ul_freemsg(ul_fd);return -1;  };   ret=ul_actailmsg(ul_fd,&msginfo);  if(ret<0)   { printf("Accept tail returned %d\n",ret);    ul_freemsg(ul_fd);    return ret;  };  if((ret=ul_read(ul_fd,ptr,len))!=len)  { printf("Bad read len %d, rq %d, msg %d\n",ret,len,msginfo.len);    ul_freemsg(ul_fd);return -1;  };    ul_freemsg(ul_fd);  return len;};/*******************************************************************/char *ul_dev_name = UL_DEV_NAME;int module= 0;int prt_modules= 0;int prt_modules_dyn= 0;int debugk     = 0;int debugk_flg = 0;int oi_var_fl  = 0;int oi_var_rd  = 0;char *oi_var_aoid=NULL;char *oi_var_val=NULL;int new_sn_flg = 0;unsigned long new_sn;int no_permanent_flg=0;int new_adr_flg = 0;int new_adr = 0;int new_adrnvsv_flg = 0;int interactive_flg = 0;#define SCAN_BLK_LEN 1024int set_new_sn(int module,unsigned long new_sn);/*******************************************************************/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 adr;  ul_fd_t ul_fd;  uchar *buf=NULL;  int buf_len;  int count=0;   uchar buf_out[10];  ul_msginfo msginfo;  int ul_ncs_filter_on=0;  ul_fd=ul_open(ul_dev_name, NULL);  if(ul_fd==UL_FD_INVALID) { perror("print_modules : uLan open failed");return -1;};  for(adr=1;adr<=max_addr;adr++)  {    ret=ul_send_query_wait(ul_fd,adr,UL_CMD_SID,  			   UL_BFL_NORE|UL_BFL_PRQ,NULL,0,(void**)&buf,&buf_len);    if(ret>=0)    { count++;      for(ret=0;(ret<buf_len)&&buf[ret];ret++);      printf("%2d:  ",adr);      fwrite(buf,ret,1,stdout);      printf("\n");      free(buf);      buf=NULL;            /* NCS information request */      if(!ul_ncs_filter_on){        memset(&msginfo,0,sizeof(ul_msginfo));        msginfo.cmd=UL_CMD_NCS;        ul_addfilt(ul_fd,&msginfo);        ul_ncs_filter_on=1;      }      buf_out[0]=ULNCS_SID_RQ;      ret=ul_send_command(ul_fd,adr,UL_CMD_NCS,  		          UL_BFL_NORE|UL_BFL_PRQ,buf_out,1);      while(1)      { ret=ul_fd_wait(ul_fd,10);        if(ret<0) return -1;        if(ret==0)        { printf("cannot retrieve SN info for %d\n",adr);          break;        }        ret=ul_acceptmsg(ul_fd,&msginfo);        if(ret<0) return ret;        if((msginfo.cmd!=UL_CMD_NCS)          ||(msginfo.sadr!=adr)          ||(msginfo.len<3))        { ul_freemsg(ul_fd);          continue;        }        buf=malloc(msginfo.len);        ret=ul_read(ul_fd,buf,msginfo.len);        ul_freemsg(ul_fd);        if(buf[0]==ULNCS_SID_RPLY)        { if(msginfo.len>=5)          { 	    printf("%2d %8lX:  ",msginfo.sadr,(buf[1])+((long)buf[2]<<8)+	    		         ((long)buf[3]<<16)+((long)buf[4]<<24));      	    fwrite(buf+5,msginfo.len-5,1,stdout);      	    printf("\n");            free(buf);            buf=NULL;            break;          }        }        free(buf);        buf=NULL;      }      /*  */    };    if(buf) free(buf);    buf=NULL;  };  ul_close(ul_fd);  return count;};int print_modules_dyn(void){ int ret;  ul_fd_t ul_fd;  uchar *buf=NULL;  int count=0;   uchar buf_out[10];  ul_msginfo msginfo;  int ul_ncs_filter_on=0;  ul_fd=ul_open(ul_dev_name, NULL);  if(ul_fd==UL_FD_INVALID) { perror("print_modules_dyn : uLan open failed");return -1;};  if(!ul_ncs_filter_on){    memset(&msginfo,0,sizeof(ul_msginfo));    msginfo.cmd=UL_CMD_NCS;    ul_addfilt(ul_fd,&msginfo);    ul_ncs_filter_on=1;  }  buf_out[0]=ULNCS_SID_RQ;

⌨️ 快捷键说明

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