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

📄 com.c

📁 DOS下的一个简单的串口测试工具
💻 C
字号:
#define DEBUG   0

#include <bios.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

/**************Below is used in bioscom() ***************************************
#define com1            0
#define com2            1

#define com_init        0
#define com_send        1
#define com_receive     2
#define com_status      3

#define baud110         0x0
#define baud150         0x20
#define baud300         0x40
#define baud600         0x60
#define baud1200        0x80
#define baud2400        0xa0
#define baud4800        0xc0
#define baud9600        0xe0

#define parityNone      0x0
#define parityOdd       0x08
#define parityEven      0x18

#define data5           0x0
#define data6           0x1
#define data7           0x2
#define data8           0x3

#define stop1           0x0
#define stop2           0x4

#define readyReceive    0x100
#define readySend       0x2000

******************************** Above is used in bioscom() *******************/
#define Clock           (1843200L)              /*   UART8250 参考计时频率         */

#define THR             0
#define RDR             0
#define IER             1
#define IIR             2
#define LCR             3
#define MCR             4
#define LSR             5
#define MSR             6
#define BRDL            0
#define BRDH            1

int printf_flag='h';
int printf_flag2   ;

#define None            0x0
#define Odd             0x1
#define Even            0x2
#define Mark            0x3
#define Space           0x4



long baud;
int com;
int base;
int data;
int stop;
int parity;


void send_now()
{
char buffer[512];
int len,i;
printf("\nEnter: ");
gets(buffer);
len=strlen(buffer);
for(i=0;i<len;i++){
	while(((inportb(base+LSR))&0x40)==0);
	outportb(base,buffer[i]);
	}
while(((inportb(base+LSR))&0x40)==0);
outportb(base,0xd);
while(((inportb(base+LSR))&0x40)==0);
outportb(base,0xa);


}

void send_file()
{
char file[128];
FILE *fp;
char c;
printf("\nFile name: ");
scanf("%s",file);
fp=fopen(file,"rb");
if(fp==NULL){printf("File not found!"); getch(); return; }
printf("Sending......");
while(!feof(fp)){
	fscanf(fp,"%c",&c);
	while(((inportb(base+LSR))&0x40)==0);
	outportb(base,c);
	}
printf("Transfer finished.\n");
fclose(fp);
}


help()
{
clrscr();
printf("Ver-2007.11.14\n\n");
printf("Command List:\n");
printf("-------------------------------------");
printf("\nA\tASCII\nH\tHex\nEnter\tNew line\n");
printf("P\tPause\nC\tClear Screen\nD\tDisplay COMn configuration\n");
printf("S\tSet COMn\n?\tThis message\n");
printf("I\tInput characters to send\n");
printf("X\tSend a file\n");
printf("N\tName the receive file\n");
printf("1\tOpen COM1\n2\tOpen COM2\n3\tOpen COM3\n4\tOpen COM4\n");
printf("Q\tQuit Program(Upper available)\n");
printf("-------------------------------------\n");
}

set(int c)
{
char temp_char;
unsigned char buffer[16];
long clock=Clock/16;
int flag=1;
switch(c){
case 1: com=1; base=0x3f8;initcom(); return;
case 2: com=2; base=0x2f8;initcom(); return;
case 3: com=3; base=0x3e8;initcom(); return;
case 4: com=4; base=0x2e8;initcom(); return;
}
clrscr();
printf("\n\n\n\nSet Serial port:\n");
printf("------------------------------------\n");
while(flag){
	printf("Please input COM[n]:\t\t%d\b",com);
	temp_char=getche();
	if(temp_char==0x1b){printf("\n"); return;}
	else if(temp_char=='\r'){printf("\n"); break;}
	putch(temp_char);
	com=temp_char-0x30;
	if(com<1 || com>4)printf("Error: 1~4 is available !\n");
	else flag=0;
} flag=1;
while(flag){
	printf("Port Address");
	switch(com)
	{
	case 1: printf("[0x3f8]:\t\t");
		base=0x3f8;
		break;
	case 2: printf("[0x2f8]:\t\t");
		base=0x2f8;
		break;
	case 3: printf("[0x3e8]:\t\t");
		base=0x3e8;
		break;
	case 4: printf("[0x2e8]:\t\t");
		base=0x2e8;
		break;
	}
	scanf("%x",&base);
	flag=0;
}flag=1;
while(flag){
	printf("Please input BPS:\t\t");
	scanf("%ld",&baud);
	if(baud<10||baud>clock)printf("Error: 10~115200 is available !\n");
	else {
		int temp;
		int ok=1;
		while(ok){
			if(clock%baud)baud--;
			else break;

		}
	flag=0;
	}
} flag=1;
while(flag){
	printf("Please input Parity:\t\t");
	scanf("%s",buffer);
	if((buffer[0]|0x20)=='n')parity=None;
	else if((buffer[0]|0x20)=='m')parity=Mark;
	else if((buffer[0]|0x20)=='s')parity=Space;
	else if((buffer[0]|0x20)=='o')parity=Odd;
	else if((buffer[0]|0x20)=='e')parity=Even;
	else {
		printf("Error: N|O|E|M|S is available !\n");
		continue;
	}
	flag=0;
}flag=1;
while(flag){
	printf("Please input Data width:\t");
	scanf("%d",&data);
	if(data<5||data>8)printf("Error: 5~8 is available !\n");
	else flag=0;
}flag=1;
while(flag){
	printf("Please input Stop width:\t");
	scanf("%d",&stop);
	if(stop!=1&&stop!=2)printf("Error: 1~2 is available !\n");
	else flag=0;
}
printf("------------------------------------\n");
initcom();
}

initcom()
{
long clock=Clock/16;
char config=0x0;
#if DEBUG
printf("com=%d\n",com);
printf("base=%d\n",base);
printf("parity=%d\n",parity);
printf("data=%d\n",data);
printf("stop=%d\n",stop);
printf("baud=%ld\n",baud);
#endif
outportb(base+LCR,0x80);
outport(base,((int)(clock/baud)));
#if DEBUG
printf("%x,%x\n",inportb(base+1),inportb(base));
#endif
switch(parity)
	{
	case None:      config|=0x0;    break;
	case Mark:      config|=0x28;   break;
	case Space:     config|=0x38;   break;
	case Odd:       config|=0x8;    break;
	case Even:      config|=0x18;   break;
	default:        config|=0x18;   break;
	}
switch(data)
	{
	case 5:         config|=0x0;    break;
	case 6:         config|=0x1;    break;
	case 7:         config|=0x2;    break;
	case 8:         config|=0x3;    break;
	default:        config|=0x2;    break;
	}
switch(stop){
	case 1:         config|=0x0;    break;
	case 2:         config|=0x4;    break;
	default:        config|=0x0;    break;
	}
outportb(base+LCR,config);

#if DEBUG
printf("%x",config);
#endif

}

disp()
{
printf("\nCurrent Settings:\n");
printf("-------------------------------------");
printf("\nCOM:\t\tCOM%d\n",com);
printf("Base:\t\t0x%x\n",base);
printf("BPS:\t\t%ld bps\n",baud);
printf("Data:\t\t%d bits\n",data);
printf("Stop:\t\t%d bit(s)\n",stop);
if(parity==Odd)
	printf("Parity:\t\tOdd\n");
else    if(parity==Even)
		printf("Parity:\t\tEven\n");
else    if(parity==Space)
		printf("Parity:\t\tSpace\n");
else    if(parity==Mark)
		printf("Parity:\t\tMark\n");
else    printf("Parity:\t\tNone\n");
printf("-------------------------------------\n");
}

main(int argc, char **argv)
{
FILE *fp;
char filename[128];
int flag;
unsigned char temp;
int status;
fp=fopen("receive","wb");
if(fp)flag=1;
else flag=0;
com=1;
baud=9600;
base=0x3f8;
data=8;
stop=1;
parity=None;
initcom();
printf_flag='h';
for(;;)
{
while((inportb(base+5)&0x1)==0)
if(kbhit())
{
printf_flag2=printf_flag;
printf_flag=getch();
if(printf_flag=='Q'){if(flag)fclose(fp);return;}
else if(printf_flag=='h'||printf_flag=='H')printf_flag2=printf_flag;
else if(printf_flag=='A'||printf_flag=='a')printf_flag2=printf_flag;
else if(printf_flag==0xd||printf_flag==0xa){printf("\n"); printf_flag=printf_flag2;}
else if(printf_flag=='?'){ help(); printf_flag=printf_flag2; getch;}
else if(printf_flag=='c'||printf_flag=='C'){clrscr();printf_flag=printf_flag2;}
else if(printf_flag=='d'||printf_flag=='D'){disp(); printf_flag=printf_flag2;}
else if(printf_flag=='p'||printf_flag=='P'){getch(); printf_flag=printf_flag2;}
else if(printf_flag=='i'||printf_flag=='I'){send_now();printf_flag=printf_flag2;}
else if(printf_flag=='x'||printf_flag=='X'){send_file();printf_flag=printf_flag2;}
else if(printf_flag=='n'||printf_flag=='N')
      {
      printf("\nFile name:\t");
      scanf("%s",filename);
      if(flag==1)fclose(fp);
      fp=fopen(filename,"wb");
      if(fp)flag=1;
      else {flag=0;  printf("File can not Open!"); getch();}
      printf_flag=printf_flag2;
      }
else if(printf_flag=='s'||printf_flag=='S'){set(0); printf_flag=printf_flag2; }
else if(printf_flag=='1'){set(1); disp(); printf_flag=printf_flag2; }
else if(printf_flag=='2'){set(2); disp(); printf_flag=printf_flag2; }
else if(printf_flag=='3'){set(3); disp(); printf_flag=printf_flag2; }
else if(printf_flag=='4'){set(4); disp(); printf_flag=printf_flag2; }
else printf_flag=printf_flag2;
}
temp=inportb(base);
if(printf_flag=='h'||printf_flag=='H'){printf_flag2=printf_flag; printf("%02x  ",temp);}
else if(printf_flag=='A'||printf_flag=='a'){printf_flag2=printf_flag; printf("%c",temp);}
else if(printf_flag==0xd||printf_flag==0xa){printf("\n"); printf_flag=printf_flag2;}
else if(printf_flag=='?'){ help(); getch(); printf_flag=printf_flag2; }
else if(printf_flag=='p'||printf_flag=='P'){getch(); printf_flag=printf_flag2;}
else if(printf_flag=='c'||printf_flag=='C'){clrscr();printf_flag=printf_flag2;}
else if(printf_flag=='i'||printf_flag=='I'){send_now();printf_flag=printf_flag2;}
else if(printf_flag=='x'||printf_flag=='X'){send_file();printf_flag=printf_flag2;}
else if(printf_flag=='n'||printf_flag=='N')
      {
      printf("\nFile name:\t");
      scanf("%s",filename);
      if(flag==1)fclose(fp);
      fp=fopen(filename,"wb");
      if(fp)flag=1;
      else {flag=0;  printf("File can not Open!"); getch();}
      printf_flag=printf_flag2;
      }
else if(printf_flag=='d'||printf_flag=='D'){disp(); printf_flag=printf_flag2; getch();}
else if(printf_flag=='s'||printf_flag=='S'){set(0);  printf_flag=printf_flag2; }
else if(printf_flag=='1'){set(1);  disp(); printf_flag=printf_flag2; }
else if(printf_flag=='2'){set(2);  disp(); printf_flag=printf_flag2; }
else if(printf_flag=='3'){set(3);  disp(); printf_flag=printf_flag2; }
else if(printf_flag=='4'){set(4);  disp(); printf_flag=printf_flag2; }
else printf_flag=printf_flag2;
if(flag)fprintf(fp,"%c",temp);
if(kbhit())
{
printf_flag2=printf_flag;
printf_flag=getch();
if(printf_flag=='Q'){if(flag)fclose(fp);return;}
}

}
}

⌨️ 快捷键说明

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