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

📄 sample.cpp

📁 C语言串口通信程序
💻 CPP
字号:
#include <dos.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define RXD 0
#define TXD 0
#define LSB 0
#define MSB 1
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6
#define IERV 1
#define OUT2 0x08
#define ERTS 2
#define EDTR 1
#define EMPTY 0X20
#define READY 0X30
#define ICREG 0X20
#define IMASKREG 0X21
#define EOI 0X20
#define WAITCOUNT 5000
#define BUFFLEN 2048
#define ALTE 0X12
#define ALTQ 0X10
int port;
unsigned portaddr;
unsigned portf;
unsigned int baudtable[]={0x180,0xc0,0x60,0x30,0x18,0x0c,0x06};
unsigned char paritytable[]={0x08,0x18,0x00,0x28,0x38};
unsigned char buffer[BUFFLEN];//recv buf
int buffin=0;
int buffout=0;
int incount=0;
int outcount=0;
void interrupt(*vect_com)(...);
void putb(unsigned char ch)//write a char to the recvbuf
	{
	int temp;
	temp=buffin;
	if(++buffin==BUFFLEN)
		buffin=0;
	if(buffin!=buffout)
		buffer[buffin]=ch;
	else
		buffin=temp;
	};
unsigned char getb()//read a char from the recvbuf
	{
	if(buffout!=buffin)
		{
		if(++buffout==BUFFLEN)
			buffout=0;
		return(buffer[buffout]);
		}
	else
		return(0xff);
	};
unsigned char sender(unsigned char ch)
	{
/*
	int wait=0;
//get the line ready signal
	for(wait=0;wait<WAITCOUNT;wait++)
		if((inportb(portaddr+MSR)&READY)==READY)
			break;
	if(wait==WAITCOUNT)
		return(0);
*/
	while(!(inportb(portaddr+LSR)&EMPTY));//get the place ready signal
	outportb(portaddr+TXD,ch);
	outcount++;
	return(1);
	};
void interrupt receiver(...)
	{
	unsigned char ch;
	ch=inportb(portaddr+RXD);
	putb(ch);
	incount++;
	outportb(ICREG,EOI);
	};
void SerInit(int baud,int datab,int stopb,int parity)
	{
	unsigned char lcr;
	disable();
	outportb(portaddr+LCR,0x80);
	outportb(portaddr+LSB,baudtable[--baud]&0xFF);
	outportb(portaddr+MSB,baudtable[baud]>>8);
	lcr=paritytable[--parity];
	lcr|=datab-5;
	lcr|=(stopb-1)<<1;
	outportb(portaddr+LCR,lcr);
	enable();
	};
void SerOpen(void)
	{
	vect_com=getvect(portf+8);
	disable();
	inportb(portaddr+RXD);
	inportb(portaddr+MSR);
	inportb(portaddr+LSR);
	inportb(portaddr+IIR);
	outportb(portaddr+IER,IERV);
	outportb(portaddr+MCR,OUT2|ERTS|EDTR);
	outportb(IMASKREG,inportb(IMASKREG)&(~(1<<portf)));
	setvect(portf+8,receiver);
	enable();
	};
void SerClose(void)
	{
	disable();
	outportb(portaddr+IER,0);
	outportb(portaddr+MCR,0);
	outportb(IMASKREG,inportb(IMASKREG)|(1<<portf));
	enable();
	setvect(portf+8,vect_com);
	};
void Getportaddr(int port)
	{
	portaddr=peek(0X40,port*2);
	portf=(port==0)?4:3;
	};
void CmdLineHelp()
	{
	printf("usage: TERMINAL com baud datab stopb parity\n");
	printf("com: 1=COM1,2=COM2\n");
	printf("baud: 1=300bps,2=600bps,3=1200bps,4=2400bps,5=4800bps,6=9600bps,7=19Kbps\n");
	printf("datab(data bits):5,6,7,8\n");
	printf("stopb(stop bits):1,2\n");
	printf("parity:1=odd,2=even,3=none,4=mark,5=space\n\n");
	};
int CheckArgv(int port,int baud,int datab,int stopb,int  parity)
	{
	if(port<1||port>2)
		return(1);
	if(baud<1||baud>7)
		return(1);
	if(datab<5||datab>8)
		return(1);
	if(stopb<1||stopb>2)
		return(1);
	if(parity<1||parity>5)
		return(1);
	return(0);
	};
void main(int  argc,char *argv[])
	{
	unsigned char key;
	char echoflag=0;
	if(argc<6)
	{
		printf("指定的参数个数不正确.\n");
		CmdLineHelp();
		exit(1);
	};
	if(CheckArgv(atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5])))
	{
		printf("命令行参数不正确.\n");
		CmdLineHelp();
		exit(1);
	};
	port=atoi(argv[1])-1;
	if(peek(0x40,port*2)==0)
	{
		printf("无指定的串行口.\n");
		CmdLineHelp();
		exit(1);
	};
	Getportaddr(port);
	SerInit(atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5]));
	SerOpen();
	printf("ALT+E 显示开/关 ALT+Q 结束\n");
	printf("OK\n");
	while(1)
	{
		if(kbhit())
		{
			key=getch();
			if(!key)
			{
				key=getch();
				if(key==ALTE)
					echoflag=~echoflag;
				if(key==ALTQ)
					break;
			}
			else
			{
				if(echoflag)
					putch(key);
				if(!sender(key))
					printf("(Time out!)");
			};
		};
		key=getb();
		if(key!=0xff)
			putch(key);
		if(key=='!'&&argc>=7)
		{
			FILE *thandle;
			printf("\nbegin to send  file %s\n",argv[6]);
			if((thandle=fopen(argv[6],"rb"))!=NULL)
			{
				int mychar;
				fseek(thandle,0,SEEK_SET);
				while((mychar=fgetc(thandle))!=EOF)
				{
                                        delay(1);
					if(echoflag)
						putch(mychar);
					if(!sender(mychar))
						printf("(Time out!)");
				}
			}
			fclose(thandle);
		}
	};
	SerClose();
	printf("%d char has been received\n",incount);
	printf("%d char has been sended\n",outcount);
	printf("\n\nOVER\n");
	exit(0);
};

⌨️ 快捷键说明

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