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

📄 modemio.c

📁 国外网站上的一些精典的C程序
💻 C
字号:
/*** This source is released to the Public** domain on December 16, 1992.**** Curtis Paris** Internet: cparis@comtch.spk.wa.usa**** modified 12-Mar-94 by Bob Stout - Added pc-port.h from SNIPPETS*/#include <stdio.h>#include <dos.h>#include <ctype.h>#include "extkword.h"#define MODEMIO_INIT#include "modemio.h"void (INTERRUPT FAR *old_modem_isr)(void);/*********************************************************************/void FAR interrupt modem_isr(void){  unsigned char c;  enable();  if (modem_buffer_count<1024) {    c=inp(modem_base);    if (((c==XON) || (c==XOFF)) && (modem_xon_xoff)) {      switch(c) {        case XON :modem_pause=0; break;        case XOFF:modem_pause=1; break;      }    } else {      modem_pause=0;      modem_buffer[modem_buffer_head++]=c;      if (modem_buffer_head>=MAX_BUFFER) modem_buffer_head=0;      modem_buffer_count++;    }    modem_overflow=0;  } else {    modem_overflow=1;  }  disable();  outp(0x20,0x20);}int com_carrier(void){  int x;  if (!modem_open) return(0);  if ((inp(modem_base+6) & 0x80)==128) return(1);  for (x=0; x<500; x++) {    if ((inp(modem_base+6) & 0x80)==128) return(1);  }  return(0);}int com_ch_ready(void){  if (!modem_open) return(0);  if (modem_buffer_count!=0) return(1);  return(0);}int com_read_ch(void)/* This returns EOF if the port hasn't been opened, or if no character * is waiting.  Otherwise it returns the next character from the port. */{  unsigned char ch;  if (!modem_open) return(EOF);  if (!com_ch_ready()) return(EOF);  ch=modem_buffer[modem_buffer_tail];  modem_buffer[modem_buffer_tail]=0;  modem_buffer_count--;  if (++modem_buffer_tail>=MAX_BUFFER) modem_buffer_tail=0;  return(ch);}void com_send_ch(unsigned char ch){  if (!modem_open) return;  outp(modem_base+4,0x0B);  if (modem_rts_cts) {    while((inp(modem_base+6) & 0x10)!=0x10) ; /* Wait for Clear to Send */  }  while((inp(modem_base+5) & 0x20)!=0x20) ;  if (modem_xon_xoff) {    while((modem_pause) && (com_carrier())) ;  }  outp(modem_base,ch);}void com_parity(char p){  int x, newb=0;  if (!modem_open) return;  x=inp(modem_base+3);  newb=((x>>6)<<6)+((x<<5)>>5); /* Get rid of old parity */  switch(toupper(p)) {    case 'N':newb+=0x00; break; /* None  */    case 'O':newb+=0x08;break;  /* Odd   */    case 'E':newb+=0x18; break; /* Even  */    case 'M':newb+=0x28;break;  /* Mark  */    case 'S':newb+=0x38;break;  /* Space */  }  outp(modem_base+3, newb);}void com_data_bits(unsigned char bits){  int x, newb=0;  if (!modem_open) return;  x=inp(modem_base+3);    newb=((x>>2)<<2); /* Get rid of the old Data Bits */  switch(bits) {    case 5 :newb+=0x00; break;    case 6 :newb+=0x01; break;    case 7 :newb+=0x02; break;    default:newb+=0x03; break;  }  outp(modem_base+3,newb);}void com_stop_bits(unsigned char bits){  int x, newb=0;  if (!modem_open) return;  x=inp(modem_base+3);  newb=((x<<6)>>6)+((x>>5)<<5); /* Kill the old Stop Bits */  if (bits==2) newb+=0x04; /* Only check for 2, assume 1 otherwise */  outp(modem_base+3,newb);}void com_speed(long speed){  int x;    char l, m;    int d;  if (!modem_open) return;  x=inp(modem_base+3); /* Read In Old Stats */  if ((x & 0x80)!=0x80) outp(modem_base+3,x+0x80); /* Set DLab On */  d=(int)(115200L/speed);  l=d & 0xFF;  m=(d >> 8) & 0xFF;  outp(modem_base+0,l);  outp(modem_base+1,m);  outp(modem_base+3,x); /* Restore the DLAB bit */}int com_open(int comport, long speed, int data_bit, unsigned char parity,      unsigned char stop_bit){  int x;  disable();  if (modem_open) com_close();  modem_port=comport;  switch(modem_port) {    case 1:modem_base=0x3F8; modem_irq=4; modem_vect=0x0C; break;    case 2:modem_base=0x2F8; modem_irq=3; modem_vect=0x0B; break;    case 3:modem_base=0x3E8; modem_irq=4; modem_vect=0x0B; break;    case 4:modem_base=0x2E8; modem_irq=3; modem_vect=0x0C; break;    case 5:break;    default:modem_base=0x3F8; modem_irq=4; modem_vect=0x0C; break;  }  outp(modem_base+1,0x00);  if (inp(modem_base+1)!=0) {    enable();    return(0);  }  /* Set up the Interrupt Info */  old_modem_ier=inp(modem_base+1);  outp(modem_base+1,0x01);  old_modem_isr=(void (INTERRUPT FAR *)(void))getvect(modem_vect);  setvect(modem_vect,modem_isr);  if (modem_rts_cts) {    outp(modem_base+4,0x0B);  } else {    outp(modem_base+4,0x09);  }  old_modem_imr=inp(I8088_IMR);  outp(I8088_IMR,old_modem_imr & ((1 << modem_irq) ^ 0x00FF));  for (x=1; x<=5; x++) inp(modem_base+x);  modem_open=1;  modem_buffer_count=0;  modem_buffer_head=0;  modem_buffer_tail=0;  com_speed(speed);  com_data_bits((unsigned char)data_bit);  com_parity(parity);  com_stop_bits(stop_bit);  enable();  return(1);}void com_close(void){  if (!modem_open) return;  outp(modem_base+1,old_modem_ier);  outp(I8088_IMR, old_modem_imr);  setvect(modem_vect, old_modem_isr);  outp(0x20,0x20);  modem_open=0;}

⌨️ 快捷键说明

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