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

📄 lb_2.c

📁 讲解了串口通讯的几个实例
💻 C
字号:
#include <math.h>
#include <stdio.h>
#include <bios.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <stdlib.h>
#include <io.h>

#define keyQ 0x1051
#define keyq 0x1071

#define line0 18
#define INT10 0x0d		/* 0x72 IRQ10, 0x0d IRQ5 */
#define RXACU 0x300
#define RXACD 0x304
#define RYACU 0x308
#define RYACD 0x30c
#define RZACU 0x310
#define RZACD 0x314
#define W273  0x320
#define W2    0x324
#define W3    0x328
#define RD2FX  0x32c	/*0x32c*/
#define RD2FY  0x339	/*0x339*/
#define RD2FZ  0x334

#define XLG    0x320
#define YLG    0x324
#define ZLG    0x328
#define CSL    0x318

#define RDWB    0x338
#define RDACLK  0x33a
#define RDTEST1 0x33c

#define RDTESTPC 0x33b
#define RDX6K   0x33d
#define RDY6K   0x33e
#define RDZ6K   0x33f

#define tt2 100                 /* Hz/sec */
void interrupt ptr0();
int i1,k1,j1,i2,k2,j2,i3,k3,j3,i4,k4,j4,kk,kk2;
int jm;
unsigned int xf2,yf2,zf2,sxf2,syf2,szf2,dxf2,dyf2,dzf2;
long int l1,l2,l3,l4,l5,count,count1,count2,count3,ss1,n1,pps0;
long int  xz0,xac,yac,zac,xac0,yac0,zac0,sxac,syac,szac,xac1,yac1,zac1;
long int  xzd0,xacd,yacd,zacd,xacd0,yacd0,zacd0,sxacd,syacd,szacd,xacd1;
long int yacd1,zacd1,xacd10,yacd10,zacd10,xacd2,yacd2,zacd2;
long int xlg,ylg,zlg,xlg0,ylg0,zlg0,xlg1,ylg1,zlg1,xlgs,ylgs,zlgs;
long int lcj10,lcj,lcj0,lcj1,lcjs,lcj2;
long int xlg2,ylg2,zlg2,xac2,yac2,zac2,xlg10,ylg10,zlg10,xac10,yac10,zac10;
long int  wb0,wb,swb,wb1,wb2, aclk0,aclk,saclk,aclk1,aclk2;
unsigned char c2016,c273,cw2,cw3,cc;
unsigned int testpc[4],s_testpc,d_testpc,x6k,s_x6k,d_x6k,y6k,s_y6k,d_y6k,
z6k,s_z6k,d_z6k,test1[6],s_test1,d_test1;
long int  wb0,wb,swb,wb1,wb2, aclk0,aclk,saclk,aclk1,aclk2;
unsigned char mem1,mem2;

unsigned int numb;

union union1
{
	int i;
	unsigned int k;
	struct struct1
	{
		unsigned char i_l;
		unsigned char i_h;
	}s1;
}un;
union union1 un3;

union union2
{
	long int l;
	struct struct2
	{
		unsigned int l_l;
		unsigned int l_h;
	}s2;
	struct struct3
	{
		unsigned char c0;
		unsigned char c1;
		unsigned char c2;
		unsigned char c3;
	}s3;
}un2;

int getkey2();
char gc();				/* return 1: GC */
FILE *fp1,*fp2;
void RECEIVEINTWORD(int RAMSEG,char *INTWORD);

long int readbuf[256];
char receintword[4]={0xa5,0x07,0x07,0x07};
int dramseg;
int intnumber;
int send422[20];

/***/
#define INTCOM1		0x0c
#define INTCOM2		0x0b
#define INTCOM3		0x0b
#define uchar unsigned char
void interrupt COM2Isr(void);
void interrupt (*oldCOM2Isr)(void);
void interrupt COM1Isr(void),COM3Isr(void);
void interrupt (*oldCOM1Isr)(void),(*oldCOM3Isr)(void);
void InitKGA();
uchar oldIntBits;
uchar strGPS[256];
float gpsLgi, gpsLti, gpsHgt;
int gpsDone=0, gpsCount=0;
void SysInit();
void SysExit();
void GPSDecode(const char *strGGA, float *lgi, float *lti, float *hgt);
FILE *fp1,*fp2;
/***/


main()
{
	int i;
	int k,flag;
	clrscr();
	pps0=0;
	cw3=0xff;
	flag=0;
	fp1=fopen("lb1.dat","w+");
	fp2=fopen("lb10.dat","w+");
	gotoxy(70,25); printf("Quit !");
	disable();
	outportb(0x20,0x20);
	mem1=inportb(0x21);
	mem2=inportb(0xa1);
	setvect(INT10,ptr0);
	outportb(0x21,mem1&0xdb);
	outportb(0xa1,mem2&0xfb);
	enable();
	
	SysInit();
	
	count=1;
	count3=0;
	jm=0;
	kk2=0;
	while(jm!=keyQ&&jm!=keyq)
	{
		jm=getkey2();
		ss1=count;
		if(ss1!=count1)
		{
			count1=ss1;
			disp();
			out2();
			/*			fprintf(fp2,"%ld %ld %ld\n",count1,xlg10,xlgs);*/
			if(count1%100==0&&count1>100)
				fprintf(fp1,"%ld %ld %ld\n",count1/100-1,xlg,xlgs);
		}
	}
	outportb(0x21,mem1);
	outportb(0xa1,mem2);
	clrscr();
}

disp()
{
	gotoxy(5,10);
	printf("Time: %6ld:%2ld",count/tt2,count%tt2);
	gotoxy(30,10);
	printf("%6ld (%3d)     %8ld              ",xlg,xf2,xlgs);
}

int getkey2()
{
	int far *ptr;
	if(*((int far *)0x0040001a)==*((int far *)0x0040001c)) return(0);
	ptr=(long int)_ES*0x10000+(long int)(*((int far *)0x0040001a));
	*((int far *)0x0040001a)=*((int far *)0x0040001c);
	return(*ptr);
}

unsigned int read_c16(int addr)
{
	unsigned int i1,i2;
	int kk;
	c273=c273&0xf7; outportb(W273,c273);
	un.s1.i_l=inportb(addr);
	c273=c273|0x08; outportb(W273,c273);
	un.s1.i_h=inportb(addr);
	i1=un.k;
	i2=i1+1;
	kk=0;
	while(i1!=i2)
	{
		c273=c273&0xf7; outportb(W273,c273);
		un.s1.i_l=inportb(addr);
		c273=c273|0x08; outportb(W273,c273);
		un.s1.i_h=inportb(addr);
		i2=i1;
		i1=un.k;
		if(++kk>3) break;
	}
	return(un.k);
}

void interrupt ptr0(void)
{ 
	int n1,n2;
	++count;
	outportb(0x32c,0);
	l2=l1+1;
	kk=0;
	while(l2!=l1) 
	{
		c273=c273&0xd7; outportb(W273,c273);	/* off lock and set low byte */
		l2=l1;++kk;
		un.s1.i_l=inportb(XLG);
		c273=c273|0x08; outportb(W273,c273);  /* high*/
		un.s1.i_h=inportb(XLG);
		l1=un.k;
		if(kk>3) break;
	}
	xlgs=xlgs+l1-xlg0;
	if(xlg0>40000&&l1<20000) 
		xlgs=xlgs+0x10000l;
	if(xlg0<20000&&l1>40000) 
		xlgs=xlgs-0x10000l;
	xlg0=l1;
	xlg10=(xlgs-xlg2);
	xlg2=xlgs;
	c273=c273|0x20; outportb(W273,c273);  /* open lock */
	if(count%tt2==0) 
	{
		dzf2=read_c16(RD2FZ);
		dxf2=read_c16(RD2FX);
		dyf2=read_c16(RD2FY);
		xf2=dxf2-sxf2;
		yf2=dyf2-syf2;
		zf2=dzf2-szf2;
		sxf2=dxf2;
		syf2=dyf2;
		szf2=dzf2;
		
		xlg=(xlgs-xlg1);
		xlg1=xlgs;
		ylg=(ylg1-ylgs);
		ylg1=ylgs;
		zlg=(zlg1-zlgs);
		zlg1=zlgs;
	}
	outportb(0x20,0x20);
	outportb(0xa0,0x20);
	if(kk>2) 
		++kk2;
}

rd_port(int port)
{
	l2=l1+1;
	if(kk<=2)  
		kk=0;
	while(l2!=l1)
	{
		c273=c273&0xf7; outportb(W273,c273);     /* set low byte */
		l2=l1;   ++kk;
		un.s1.i_l=inportb(port);
		c273=c273|0x08; outportb(W273,c273);     /* high */
		un.s1.i_h=inportb(port);
		l1=un.k;
		if(kk>3) break;
	}
}

/************************************************************/

void SysInit()
{
	/*COM1*/
	outportb(0x3fb,0x80);
	outportb(0x3f8,0x03);	/*0c 9600,03 38.4k bps*/
	outportb(0x3f9,0x00);
	outportb(0x3fb,0x0b);
	outportb(0x3fc,0x0b);
	inportb(0x3f8);
	outportb(0x3fc,0x0b);
	outportb(0x3f9,0x01);
	outportb(0x3fb,0x03);
}

callfk()
{ 
	long int i;
	char c3;
	i=0;
	while(i<50000l)
	{ 
		c3=inportb(0x3fd)&0x20;
		if(c3!=(char)0) break;
		++i;
	}
}

calljj()
{ 
	long int i;
	char c3;
	i=0;
	while(i<500000l)
	{ 
		c3=inportb(0x3fd)&0x01;
		if(c3!=(char)0) break;
		++i;
	}
	if(i<500000l) return(0);
	else return(1);
}

out2()
{ 
	int i;
	unsigned char str1[11],cc;
	str1[0]=0xa5;
	str1[1]=0x5a;
	un.i=xlg10;
	str1[2]=un.s1.i_l;
	str1[3]=un.s1.i_h;
	un.i=xf2;
	str1[4]=un.s1.i_l;
	str1[5]=un.s1.i_h;
	un2.l=xlgs;
	str1[6]=un2.s3.c0;
	str1[7]=un2.s3.c1;
	str1[8]=un2.s3.c2;
	str1[9]=un2.s3.c3;
	cc=0;
	for(i=0;i<10;++i) 
		cc=cc+str1[i];
	str1[10]=cc;
	for(i=0;i<11;++i) 
	{
		callfk();
		outportb(0x3f8,str1[i]);
	}
}

⌨️ 快捷键说明

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