📄 1okencom.c
字号:
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include <bios.h>
#define ESC 27
#define BUF_SIZE 1000
#define OK '0'
#define CONNECT '1'
#define RING '2'
#define NO_CARRIER '3'
#define ERROR '4'
#define CONNECT_12 '5'
#define NO_DIAL_TONE '6'
#define BUSY '7'
#define CONNECT_24 10
#define CONNECT_48 11
#define CONNECT_96 12
#define CONNECT_192 14
#define KB_F1 0x3b00
#define KB_F2 0x3c00
#define KB_F3 0x3d00
#define KB_F4 0x3e00
#define KB_F5 0x3f00
#define KB_F6 0x4000
#define KB_F7 0x4100
#define KB_F8 0x4200
#define KB_F9 0x4300
#define KB_F10 0x4400
#define KB_F11 0x4500
#define KB_F12 0x4600
FILE *fpr ;
int com_n,IRQ_n;
int com_address[8]={0x3f8,0x2f8, 0x3e8,0x2e8, 0x420,0x428, 0x520,0x528 };
char *baud_c[]={"1200","2400","4800","9600","19200","28800","38400","57600","115200","172800"};
int baud[10]={ 0x60, 0x30, 0x18, 0x0c, 0x06, 0x04, 0x03, 0x02, 0x01, 0x80};
int blt;
int baud_n;
int maskb;
unsigned char buffer[BUF_SIZE+2];
unsigned char outchar,inchar;
unsigned int cirin=0,cirout=0,charsinbuf=0;
void interrupt get();
void interrupt (*oldint)();
union REGS regs;
int init()
{
cirin=0;cirout=0;charsinbuf=0;
if((com_n==0)||(com_n==2))IRQ_n=4;
if((com_n==1)||(com_n==3))IRQ_n=3;
baud_n = 5 ;
maskb=inportb(0x21);
printf("Try COM%d\n",com_n+1);
if(IRQ_n==4)
{
oldint=getvect(0x0c);
setvect(0x0c,get);
outportb(0x21,maskb&0x0ef);
}
else
{
oldint=getvect(0x0b);
setvect(0x0b,get);
outportb(0x21,maskb&0x0f7);
}
outportb(0x20,0x20);
cirin=0;cirout=0;charsinbuf=0;
outportb(com_address[com_n]+3,0x80); //0x3fb,0x80
outportb(com_address[com_n]+0,baud[baud_n]); //0x3f8,0x18
outportb(com_address[com_n]+1,0x00); //0x3f9,0x00
outportb(com_address[com_n]+3,0x23); //0x3fb,0x23
outportb(com_address[com_n]+4,0x0b); //0x3fc,0x0b
outportb(com_address[com_n]+1,0x01); //0x3f9,0x01
enable();
}
void clear_buf()
{
cirin=0;cirout=0;charsinbuf=0;
}
int sendchar(unsigned char ch)
{
delay(1);
while(!inportb(com_address[com_n]+5)&0x20);
outportb(com_address[com_n],ch);
printf("%02X ",ch);
}
void interrupt get()
{
outportb(com_address[com_n]+4,0x09);
if(charsinbuf<BUF_SIZE)
{
buffer[cirin]=inportb(com_address[com_n]);
if(cirin<BUF_SIZE)cirin++;
else cirin=0;
charsinbuf++;
outportb(0x20,0x20);
}
outportb(com_address[com_n]+4,0x0b);
}
int sendchars(char chs[])
{
int i;
for(i=0;chs[i];i++)sendchar(chs[i]);
}
unsigned char getcharinbuf()
{
unsigned int ch;
if(charsinbuf>0)
{
ch=buffer[cirout];
if(cirout<BUF_SIZE)cirout++;
else cirout=0;
charsinbuf--;
return(ch);
}
else return('\0');
}
int convert_hex(unsigned char *s,int i)
{
int val,l=0;
unsigned char buf[5],buffer;
for(l=0;l<i;l++)
{
strncpy(buf,s+2*l,2);
buf[2] = 0x20;
buf[3] = 0;
sscanf(buf,"%x",&val);
s[l] = val;
}
return(0) ;
}
void send_command(char *string)
{
int i ,j ,length ;
unsigned char buffer[60] , checksum ;
for(;;)
{
fgets(string,130,fpr) ;
if(strncmp(string,"REM",3))break ;
//else printf("%s",&string[3]);
}
length = strlen(string)-1 ;
convert_hex(string,length/2) ;
checksum = 0;
for(i=0;i<length/2;i++)
{
checksum = checksum+string[i] ;
}
string[length/2] = checksum ;
buffer[0] = 0x02 ;
j = 1 ;
for(i=0;i<length/2+1;i++)
{
if((string[i]==0x02)||(string[i]==0x03)||(string[i]==0x10))
{
buffer[j] = 0x10;
j++ ;
}
buffer[j] = string[i] ;
j++ ;
}
buffer[j] = 0x03 ;
i = 0 ;
while(1)
{
sendchar(buffer[i]);
if((buffer[i]==0x03)&&(buffer[i-1]!=0x10)) break ;
i ++ ;
}
}
int main(int argv,char *argc[])
{
unsigned char chs[256] ;
unsigned int key,j;
int i,flag,bz ;
unsigned char a,c ;
FILE *fp ;
fp=fopen("lck.txt","wb");
fpr=fopen("command.txt","r");
if(argv<2)com_n=0;
else{
com_n=argc[1][0]-'1';
if(com_n>7)com_n=7;
}
com_n = 1 ;
init();
do{ while(charsinbuf)
{
a = getcharinbuf();
if(a==0xaa)
{
printf("\n") ;
fprintf(fp,"\n");
}
else
{
printf("%02x ",a);
fprintf(fp,"%02x",a);
}
}
if(kbhit())
{
key=bioskey(0);
if(key==KB_F1)
{ printf("\n");
fprintf(fp,"\n") ;
send_command(chs) ;
printf("\n") ;
fprintf(fp,"\n") ;
}
else if(key==KB_F2)
{
fclose(fpr) ;
fpr=fopen("command.txt","r");
}
else if(key==KB_F9) clrscr();
if((key&0xff)==0)continue;
if((key&0xff)==27)
{
fclose(fpr);
fclose(fp) ;
break;
}
}
}while(1);
if(IRQ_n==4) setvect(0x0c,oldint);
else setvect(0x0b,oldint);
outport(0x21,maskb);
return 1 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -