亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rs232.c

?? RS232.C was written to provide all of the basic functionality needed to employ serial I/O in any a
?? C
?? 第 1 頁 / 共 4 頁
字號:

  if(! rs_portopen) /* is a port open? */
    return -1;

  if(! rs_ds.rcv_cnt) /* char available ? */
    return -1;
  return (int)(*(rs_ss.in_buf + rs_ds.in_tail));

}

/* rs_getbyt: Return next available character from input buffer - return
   -1 if none are available */
int rs_getbyt(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;
  unsigned char rs_byt;

  if(! rs_portopen) /* is a port open? */
    return -1;

  if(! rs_ds.rcv_cnt) /* char available ? */
    return -1;
  rs_byt = *(rs_ss.in_buf + rs_ds.in_tail++);
  rs_ds.rcv_cnt--;
  rs_ds.in_tail &= rs_ss.ibuf_siz;
  return (int)rs_byt;

}

/* rs_getstr: Get specified number of bytes from port buffer and place in
   user specified buffer.  Null terminate string.  If receive buffer
   has fewer than the requested number of characters available, copy all
   that are available.  Return number of bytes copied.  If rs_getcnt is 0,
   copy characters until a nul is encountered (include it in getbuf) */
int rs_getstr(int rs_getcnt,char *rs_getbuf)
{

  extern struct rs_statics rs_ss;
  extern int rs_portopen;
  int rs_x = 0;
  int rs_c,rs_y;

  if(! rs_portopen) /* is a port open? */
    return -1;

  if(rs_getcnt) /* was number of characters specified? */
    rs_y = rs_getcnt;
  else
    rs_y = rs_ss.ibuf_siz;

  while(rs_x < rs_y){
    if((rs_c = rs_getbyt()) < 0)
      break;
    else
      *(rs_getbuf + rs_x++) = (char)rs_c;
    if(! rs_getcnt){ /* if no length specified, end when nul is encountered */
      if(! rs_c)
        break;
      }
    }

  if(rs_getcnt) /* nul terminate if need be */
    *(rs_getbuf + rs_x) = '\0';
  return rs_x;

}

/* rs_inrcvd: Return number of received bytes waiting to be read from input
   buffer. */
unsigned rs_inrcvd(void)
{

  extern volatile struct rs_dynamics rs_ds;
  extern struct rs_statics rs_ss;

  if(rs_ds.rcv_cnt > rs_ss.ibuf_siz + 1){
    rs_ds.rcv_cnt = rs_ss.ibuf_siz + 2;
    return(rs_ss.ibuf_siz + 1);
    }
  else
    return rs_ds.rcv_cnt;

}

/* rs_error: Return last error detected as follows:
        bit 0: 1 = Buffer overrun
        bit 1: 1 = Receive data overrun
        bit 2: 1 = Parity error
        bit 3: 1 = Framing error
        bit 4: 1 = Break detected
        bit 7: 1 = Error in receive FIFO */
int rs_error(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  int rs_errtmp;

  rs_errtmp = (int)(rs_ds.err_cod & 0x9E);
  if(rs_ds.rcv_cnt > (rs_ss.ibuf_siz + 1)){ /* receive buffer overflow ? */
    rs_errtmp |= 0x01;                      /*   set flag */
    rs_ds.rcv_cnt = rs_ss.ibuf_siz + 1;
    }
  rs_ds.err_cod = '\0';
  return rs_errtmp;

}

/* rs_modctrl: If rs_cmd = 0, return value of modem status register as of
   most recent change.  If rs_cmd = 1, switch line determined by parameter1
   on or off depending on whether parameter2 is 1 or 0.  If rs_cmd = 2,
   return contents of modem control register */
int rs_modctrl(int rs_cmd,...)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;
  unsigned char rs_cntrl;
  int rs_tmp = 0;
  va_list rs_ap;

  va_start(rs_ap,rs_cmd);

  if(rs_portopen){
    if(rs_cmd == 2)
      rs_tmp = inportb(rs_ss.mcr);
    else if(rs_cmd == 1){ /*manipulate control line (modem control reg.) */
      rs_cntrl = (unsigned char)(va_arg(rs_ap,int));
      if(va_arg(rs_ap,int))
        rs_cntrl |= inportb(rs_ss.mcr);
      else{
        rs_cntrl ^= '\xFF';
        rs_cntrl &= inportb(rs_ss.mcr);
        }
      outportb(rs_ss.mcr,rs_cntrl);
      }
    else{ /* get modem status register */
      rs_tmp = (int)rs_ds.msr_cod;
      rs_ds.msr_cod &= '\xF0';
      }
    }
  else /* no port open */
    rs_tmp = -1;

  va_end(rs_ap);

  return rs_tmp;

}

/* send break */
int rs_break(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;
  unsigned char rs_tmp;
  unsigned rs_time;

  if(! rs_portopen) /* is a port open? */
    return -1;

  rs_tmp = (char)inportb(rs_ss.lcr);

  while(rs_ds.out_tail != rs_ds.out_head)
    if(rs_ds.ier_msk == '\x0D')
      break;

  while(!((inportb(rs_ss.lsr)) & '\x20'))
    ;

  rs_tmp = inportb(rs_ss.lcr);
  rs_time = rs_timer(1);
  outportb(rs_ss.lcr,rs_tmp | '\x40');
  while(rs_timer(1) - rs_time < 4)
    ;
  outportb(rs_ss.lcr,rs_tmp);

  return 0;

}

/* clear input buffer */
void rs_clrin(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;

  if(! rs_portopen) /* is a port open? */
    return;

  disable();
  rs_ds.in_tail = rs_ds.in_head;
  rs_ds.rcv_cnt = 0;
  if(rs_ss.xmitfifo == 16) /* if FIFOs enabled */
    outportb(rs_ss.fcr,'\x43'); /* clear RCVR FIFO */
  enable();

}

/* clear output buffer */
void rs_clrout(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;

  if(! rs_portopen) /* is a port open? */
    return;

  disable();
  rs_ds.out_tail = rs_ds.out_head;
  if(rs_ss.xmitfifo == 16) /* if FIFOs enabled */
    outportb(rs_ss.fcr,'\x45'); /* clear XMIT FIFO */
  enable();

}

/* use BIOS keyboard buffer head and tail pointers to determine if a key
   has been pressed */
int rs_keyhit(void)
{

  volatile int far* rs_keytail;
  volatile int far* rs_keyhead;

  rs_keyhead = (int far*)MK_FP(0x40,0x1A);
  rs_keytail = rs_keyhead + 1;

  if(*rs_keytail == *rs_keyhead)
    return 0;
  else
    return 1;

}

/* use BIOS data area tick count to as 10/182 sec. resolution timer.  If
   rs_cmd is 0, clear counter and return count up to that point.  Id
   rs_cmd is non-zero, return tick count from the point which timer is
   last cleared. */
unsigned rs_timer(int rs_cmd)
{

  volatile unsigned long far* rs_biosticks;
  static long rs_startticks;
  unsigned rs_tmp;

  rs_biosticks = (unsigned long far*)MK_FP(0x40,0x6C);

  if(rs_cmd){
    if(*rs_biosticks >= rs_startticks)
      return((unsigned)(*rs_biosticks - rs_startticks));
    else
      return((unsigned)(*rs_biosticks + 1573040UL - rs_startticks));
    }
  else{
    if(*rs_biosticks >= rs_startticks)
      rs_tmp = (unsigned)(*rs_biosticks - rs_startticks);
    else
      rs_tmp = (unsigned)(*rs_biosticks + 1573040UL - rs_startticks);
    rs_startticks = *rs_biosticks;
    }

  return rs_tmp;

}

/* rs_setflow: rs_cmd = 0: Turn flow control off
               rs_cmd = 1: Set flow control to hardware - Parameter1
                           is hardware line to monitor.
               rs_cmd = 2: Set flow control to XON/XOFF - Parameter1
                           is character to use for XON, Parameter2
                           is character to use for XOFF.
               rs_cmd = 3: Return status of flow control - 0 = output
                           normal, 1 = output halted
               rs_cmd = 4: Insert control character in output stream.
                           Parameter1 is control character.
               rs_cmd = 5: Manipulate hardware line.  Parameter1 is bit
                           pattern corresponding to line to change.
                           If parameter2 is 0, line is turned off,
                           if 1, line is turned on*/
int rs_setflow(int rs_cmd,...)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;
  int rs_ret = 0;
  unsigned char rs_cntrl;
  va_list rs_ap;

  va_start(rs_ap, rs_cmd);

  if(rs_portopen){
    switch(rs_cmd){
      case 0: /* turn flow control off */
        rs_ss.flow = rs_cmd;
        break;
      case 1: /* set flow control to hardware */
        rs_ss.flow = rs_cmd;
        rs_ss.hdw_flw = ((char)(va_arg(rs_ap,int))) << 4;
        if((inportb(rs_ss.msr)) & rs_ss.hdw_flw)
          rs_ds.ier_msk = '\x0F';
        else
          rs_ds.ier_msk = '\x0D';
        break;
      case 2: /* set flow control to XON/XOFF */
        rs_ss.flow = rs_cmd;
        rs_ss.xon = (char)(va_arg(rs_ap,int));
        rs_ss.xoff = (char)(va_arg(rs_ap,int));
        break;
      case 3: /* return status of flow control */
        rs_ret = (rs_ds.ier_msk == '\x0D');
        break;
      case 4: /* insert control character in output stream */
        rs_cntrl = (char)(va_arg(rs_ap,int));
#ifndef RS_POLLED_XMIT
        outportb(rs_ss.ier,'\x0D');
#endif
        while(!(inportb(rs_ss.lsr) & '\x20'))
          ;
        outportb(rs_ss.thr,rs_cntrl);
#ifndef RS_POLLED_XMIT
        outportb(rs_ss.ier,rs_ds.ier_msk);
#endif
        break;
      }
    }
  else /* no port open */
    rs_ret = -1;

  va_end(rs_ap);

  return rs_ret;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色哟哟一区二区三区| 亚洲国产成人午夜在线一区| 欧美成人官网二区| 亚洲欧美aⅴ...| 久久成人综合网| 色婷婷久久一区二区三区麻豆| 日韩免费在线观看| 综合久久一区二区三区| 久久福利视频一区二区| 色欧美片视频在线观看在线视频| 精品国产欧美一区二区| 亚洲影院在线观看| 成人黄色av网站在线| 日韩一级完整毛片| 亚洲国产一区二区在线播放| 成人av在线资源| 精品成人一区二区三区| 日韩在线观看一区二区| 色综合久久久网| 中文字幕精品一区二区精品绿巨人| 日韩成人一区二区三区在线观看| 99久久99久久久精品齐齐| 精品国产免费久久| 免费观看在线色综合| 91国产丝袜在线播放| 亚洲视频图片小说| 成人小视频在线| 精品国产乱码久久久久久久| 日本亚洲电影天堂| 欧美日韩久久一区二区| 亚洲综合av网| 91在线视频在线| 中文字幕在线不卡一区| 国产aⅴ精品一区二区三区色成熟| 欧美sm美女调教| 麻豆久久一区二区| 日韩精品一区二区三区视频播放 | 欧美日韩一区高清| 悠悠色在线精品| 欧美制服丝袜第一页| 一区二区三区高清不卡| 色婷婷狠狠综合| 一区二区三区四区中文字幕| 欧洲激情一区二区| 一区二区三区电影在线播| 在线免费观看日本一区| 一区二区三区不卡视频| 欧美在线观看视频在线| 五月婷婷综合网| 日韩欧美在线一区二区三区| 久久精品国产精品青草| 久久久久久久久久久久久久久99 | 欧美在线制服丝袜| 亚洲国产另类av| 日韩亚洲国产中文字幕欧美| 精品无人区卡一卡二卡三乱码免费卡 | 91丨九色丨尤物| 亚洲成人激情社区| 日韩欧美综合在线| 国产精品18久久久久久久网站| 国产欧美一区二区三区沐欲| 99久久伊人精品| 性欧美疯狂xxxxbbbb| 欧美成人伊人久久综合网| 国产.欧美.日韩| 一区二区三区国产精品| 欧美xxxx在线观看| 99在线视频精品| 日韩精品免费视频人成| 久久精品一区四区| 在线观看国产91| 国产呦萝稀缺另类资源| 国产精品久久久久久久久免费丝袜| 91黄色免费版| 国内精品伊人久久久久av一坑| 综合自拍亚洲综合图不卡区| 欧美日韩国产影片| 国产成人免费网站| 亚洲国产日日夜夜| 日本一区二区三区在线不卡| 欧美性受xxxx黑人xyx性爽| 麻豆精品一区二区三区| 亚洲欧洲综合另类| 欧美一级xxx| 99精品久久99久久久久| 久久精品国产网站| 一区二区免费在线播放| 26uuu久久综合| 精品污污网站免费看| 丁香一区二区三区| 美女尤物国产一区| 一区二区三区久久| 国产精品毛片久久久久久| 欧美一级生活片| 欧美艳星brazzers| av毛片久久久久**hd| 韩国一区二区在线观看| 偷拍亚洲欧洲综合| 亚洲视频1区2区| 亚洲国产成人午夜在线一区 | 成人app软件下载大全免费| 日本伊人色综合网| 亚洲一区在线观看视频| 国产精品久久久久久久久搜平片 | 欧美日韩另类国产亚洲欧美一级| 成人av电影免费观看| 国产精品一区二区x88av| 黑人巨大精品欧美黑白配亚洲| 日韩精品中午字幕| 亚洲欧美日本在线| 久久成人麻豆午夜电影| 亚洲超碰97人人做人人爱| 欧美—级在线免费片| 精品噜噜噜噜久久久久久久久试看| 欧美狂野另类xxxxoooo| 欧美亚洲愉拍一区二区| 91在线免费视频观看| 成人黄色在线网站| 成人美女视频在线看| 国产麻豆视频一区| 国产精品一品视频| 国产精品18久久久| 成人亚洲一区二区一| 成人小视频免费在线观看| 国产传媒久久文化传媒| 成人午夜电影网站| av在线播放一区二区三区| av在线不卡网| 色先锋久久av资源部| 在线区一区二视频| 欧美日韩国产影片| 日韩一级成人av| 久久网站热最新地址| 国产亚洲一区二区在线观看| 久久先锋影音av| 国产精品久久毛片av大全日韩| 国产精品国产三级国产有无不卡| 国产精品成人网| 一区二区三区成人在线视频| 亚洲超碰精品一区二区| 麻豆中文一区二区| 国产盗摄女厕一区二区三区| 99在线精品一区二区三区| 91成人在线免费观看| 欧美一级在线免费| 国产日韩av一区| 一级精品视频在线观看宜春院| 天涯成人国产亚洲精品一区av| 精品一区二区三区免费毛片爱| 国产一区二区久久| 一本色道a无线码一区v| 国产精品进线69影院| 亚洲尤物视频在线| 国产一区二区免费在线| 色综合一个色综合亚洲| 日韩一区二区精品| 久久精品亚洲乱码伦伦中文 | 国产精品青草久久| 亚洲曰韩产成在线| 国产高清亚洲一区| 欧美视频你懂的| 久久精品亚洲精品国产欧美kt∨| 亚洲视频小说图片| 韩国女主播一区| 欧美亚洲国产一区二区三区 | 久久综合九色综合欧美亚洲| 国产精品久久久久9999吃药| 日韩avvvv在线播放| 成人精品国产免费网站| 欧美一区二区免费视频| 综合色天天鬼久久鬼色| 另类小说欧美激情| 日本福利一区二区| 中文无字幕一区二区三区 | 国产自产高清不卡| 在线观看日韩精品| 国产精品无人区| 日韩二区三区四区| 色综合咪咪久久| 国产欧美精品一区| 久久99久久99精品免视看婷婷 | 激情久久五月天| 欧美日韩国产高清一区二区| 国产精品九色蝌蚪自拍| 国产一区二区三区免费看| 欧美精品aⅴ在线视频| 最新日韩av在线| 成人一级黄色片| 久久久蜜桃精品| 麻豆国产精品官网| 欧美二区三区91| 亚洲午夜激情网页| 色综合久久久网| 亚洲欧美经典视频| av男人天堂一区| 亚洲视频在线一区| 不卡影院免费观看| 欧美激情资源网| 成人网页在线观看| 国产日韩v精品一区二区|