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

📄 s7026.cpp

📁 DOS下使用PCI扩展串口的程序希望对大家有用
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		  timesec=time(NULL);
		  for (i=0; i < SIZEb-rb_size;)
		  {
			   receivf=0;
			   transf=0;
			   outportb(BaseAdr+portadr[gstepn]+IER, 0x02);
			   //enable transmit and  receive interrupt
			   if (display==1)
			   {
				   if (re_rec==1)
				   {
					   gotoxy(x,y);
					   printf("%d %c",i,BBuffer[gstep][i-1]);
					   re_rec=0;
				   }
			   }
			   if ((time(NULL)-timesec) > 20)
			   {
					fprintf(stderr,"\ncheck physical connection,confirmed right and try again\n");
					printf("if confirmed, what wrong with the two ports \n");
					exit(0);
			   }
			   if ((1==transf)&&(0==receivf))
			   {
				   printf("PORT%d couldn't receive,check physical connection\n",gstep+1);
				   transf=0;
				   break;
			   }
			   if ((bioskey(1)!=0))//press any key to break
			   {
				   bioskey(0);
				   break;
			   }
				//delay(20);
		  }
			if (display==1)
				 printf("\n");
	}

	else if (gstep < PORTSUM)             //a port comminute to other device serial port
	{
		  outportb(BaseAdr+portadr[gstep]+IER, 0x01);
		  fprintf(stderr, "Receive char number and last char:");
		  x=wherex();
		  y=wherey();
		  if (portsend == 1)
		  {
			  i=0;
			  {
				  outport(BaseAdr+portadr[gstep],txbuf1[1]);
				  head1=0;
			  }
			  for (; ;)
			  {
				  outportb(BaseAdr+portadr[gstep]+IER, 0x03);
				  //enable transmit and  receive interrupt
				  if ((bioskey(1)!=0))//press any key to break
				  {
					  bioskey(0);
					  break;
				  }
				  if (i >= SIZEb-rb_size)
				  {
					   break;
				  }
				  gotoxy(x,y);
				  printf("%d  %c",ide[gstep],BBuffer[gstep][i-1]);
				  // delay(20);
			  }
		  }
		  for ( ; i < SIZEb-rb_size ;)
		  {

			   if ((bioskey(1)!=0))//press any key to break
			   {
				   bioskey(0);
				   break;
			   }
		  }
		   //return 0;
			if (display==1)
			  printf("\n");
	}

	else     //eight port
	{
		   for (j=0; j < PORTSUM; j++)
		   {

				if (titl950 < 36)
				{
					titl950=36;
					tralevel=rb_size-titl950;
				}
				for (i=0; i < PORTSUM; i++)
				{
					 IndecontrolReg(BaseAdr,portadr[i],0x0c,0x00);
					 UartsRegsset(BaseAdr, portadr[i], bautrat);
					 //IndecontrolReg(BaseAdr,portadr[i],TTL, titl950);
					 outportb(BaseAdr+portadr[i]+IER, 0x00);
					 outportb(BaseAdr+portadr[i]+LCR, inportb(BaseAdr+portadr[i]+LCR) & 0x7f);
					 while ((inportb(BaseAdr+portadr[i]+LSR) & 0x01) == 0x01)
						   inportb(BaseAdr+portadr[i]);
				}

				outportb(BaseAdr+portadr[7-j]+IER, 0x01);
				if (modevar == 6)
				{
					for (head2=tralevel; head2 != rb_size; head2++)//trigger empty trans
					{
						 outportb(BaseAdr+portadr[gstep], txbuf1[head2]);
					}
				}
				else if (modevar == 4)
				{
					for (head2=(rb_size-titl650); head2 != rb_size; head2++)//trigger empty trans
					{
						 outportb(BaseAdr+portadr[gstep], txbuf1[head2]);
					}
				}
				else
				{
					outport(BaseAdr+portadr[gstep],txbuf1[1]);
					head1=0;
				}

				 if (display==1)
				 {
					 printf("PORT%d Interrupt received char number last char:",8-j);
					 x=wherex();
					 y=wherey();
				 }
				timesec=time(NULL);
				for (i=0 ; i < SIZEb-rb_size;)
				{
					 outportb(BaseAdr+portadr[j]+IER, 0x02);
					 //enable transmit and  receive interrupt

					 if ((bioskey(1)!=0))//press any key to break
					 {
						 bioskey(0);
						 break;
					 }
				  if (display==1)
				  {
				   if (re_rec==1)
				   {
					   gotoxy(x,y);
					   printf("%d %c",i,BBuffer[7-j][i-1]);
					   re_rec=0;
				   }
				  }
				  if ((time(NULL)-timesec) > 20)
				  {
					fprintf(stderr,"\ncheck physical connection,confirmed right and try again\n");
					printf("if confirmed, what wrong with PORT %d couldn't receive char\n",8-j);
					exit(0);
				  }

				}

				delay(8);
				if (display==1)
				printf("\n");
			   }
		  }


	 for (j=0; j < PORTSUM; j++)
	     outport(BaseAdr+portadr[j]+IER, 0x00);
	 Close_txrx(intvet);
	 //showmsg(ErrDetected, ErrorCode);
	 if (modevar == 4)
		slength=titl650;
	 else if (modevar == 6)
		slength=titl950;
	 else slength=rb_size;
	 cyccount=(SIZEb-rb_size)/slength;

	 //if (loopbackb==0x10)
	if (portsend == 1)
	{
	  if (ide[gstep] >= SIZEb-rb_size)
	  {
		 BBuffer[gstep][SIZEb-rb_size]='\0';
		 printf("%s",BBuffer[gstep]);
		 exit(0);
	  }
	}


	  for (i=0; i < PORTSUM; i++)
		 intok[i]=0;
	 if (stsleng == 0)
	 {

	 for (i=0; i < PORTSUM; i++)
	  {
	   if (BBuffer[i][0] == 0xff)continue;
	 errno=0;
	 recright=0;
	 if ((modevar == 4)||(modevar == 6))
		{
		 for (k=0; k<slength; k++)
			 {
			  Stemp[k]=txbuf1[rb_size-slength+k];
			 }
		 Stemp[k]='\0';
		}
	 else strcpy(Stemp, txbuf1);
	 for (m=0,l=0; l<2; l++)
		 {
		  for (; ;m++)
			  {
			  if (BBuffer[i][m]==Stemp[0])break;
			  }
		   m++;
		  }
	  m--;

	 for (k=0; k<cyccount; k++)
		 {
		  for (l=0; l<slength; l++)
			  {
			   if (modevar==4||modevar==6)
				  Rtemp[l]=BBuffer[i][k*slength+m+l];
			   else Rtemp[l]=BBuffer[i][k*slength+l];
			   if (display==1)
				 {
				  if ((gstep<PORTSUM)&&(gstepn<PORTSUM))
				 printf("%c",Rtemp[l]);
				 }
			  }
		  Rtemp[l]='\0';
		  if (!strcmp(Stemp,Rtemp))
				 recright++;
		  else errno++;
		 }
	 if ((recright == cyccount)||((recright+1)==cyccount)||(errno < 3))
		intok[i]=1;
	 else if(errno>1) intok[i]=errno;
	   }
	 if (display==1)
	  printf("\n");
	   for (i=0; i < PORTSUM; i++)
	  {
	   if (intok[i] == 1)
		{
		 printf("PORT%d Interrupt ",i+1);
		 textcolor(GREEN);
		 printf("OK \r\n");
		 textattr(CRTtextinfo.attribute);
		}
	 else  if (intok[i] > 1)
		printf("existing %d  error \n",intok[i]);

	  }
	 }//end strleng==0
	 else//if (stsleng > 0)
	   {

		 for (i=0; i < PORTSUM; i++)
			 {
			  if (BBuffer[i][0] == 0xff)continue;
			  for (j=0; j < 128; j++)
				  printf("%c",BBuffer[i][j]);
			  printf("\n\r");
			 }
		}

	 if (com1_writefileid==1)
		{
		 if ((com1_fp=fopen("\\com1xx.dat","ab"))==NULL)
			{
			 printf("cannot open \\com1xx.dat file\n");
			}
		 if (com1_writebufferid==1)
			{
			 if (portsend == 1)
				fwrite(BBuffer[gstep],SIZEb,1,com1_fp);
			 else  if (gstep < PORTSUM)
				fwrite(BBuffer[gstep],SIZEb,1,com1_fp);
			 else
				fwrite(BBuffer[2],SIZEb,1,com1_fp);
			 fclose(com1_fp);
			 com1_writefileid=0;
			}
		 else
			{
			 if (gstep < PORTSUM)
				fwrite(BBuffer[gstep],SIZEb,1,com1_fp);
			 else
				fwrite(BBuffer[2],SIZEb,1,com1_fp);
			 fclose(com1_fp);
			 com1_writefileid=0;
			}
		}

	 if (com2_writefileid==1)
		{
		 if ((com2_fp=fopen("\\com2xx.dat","ab"))==NULL)
			{
			 printf("cannot open \\com2xx.dat file\n");
			}
		 if (com2_writebufferid==1)
			{
			 if (gstepn < PORTSUM)
				fwrite(BBuffer[gstepn],SIZEb,1,com1_fp);
			 else
				fwrite(BBuffer[1],SIZEb,1,com2_fp);
			 fclose(com2_fp);
			 com2_writefileid=0;
			}
		 else
			{
			 if (gstepn < PORTSUM)
				fwrite(BBuffer[gstepn],SIZEb,1,com1_fp);
			 else
				fwrite(BBuffer[1],SIZEb,1,com2_fp);
			 fclose(com2_fp);
			 com2_writefileid=0;
			}
		}
	return 0;
   }
/*
void SendChar(int chanel,char c)
{
	unsigned int port=BA[chanel];
	while((inportb(port+LSR) & 0x20) !=0x20) ;
			outportb(port+THR,c);
}
void SendString(int chanel,char *buffer,int len)
{
	int i;
	for(i=0;i<len;i++)
		SendChar(chanel,buffer[i]);
}

enum portstate{NONE,STARTSEND,SENDING,ENDSEND,STARTRECIEVE,RECIEVING,ENDRECIEVE};
enum portstate ps[8],pspre[8];//ps1=NONE,ps1pre=NONE,ps2=NONE,ps2pre=NONE;
BQue queue[8];
BQue *ptrqueue[8];
char buf[8][2048];//buf2[2048];

int Intertxrx( )
   {
	int k;
	char recloop[8];
	char sendchar[8];
	char  endchar,c,tt;
	char  seldata;
	char  pause=0;
	char  display=0;
	for (k=0; k < 8; k++)
		{
		 ps[k]=NONE;
		 pspre[k]=NONE;
		}

	for (k=0; k < 8; k++)
		{
		 ptrqueue[k]=&queue[k];
		}
	printf("select data bits:[0--5 1--6 2--7 3--8]:");
	scanf("%d",&seldata);
	switch(seldata){
		case 0://5 bit
			endchar=0x1f;
			break;
		case 1://6 bit
			endchar=0x3f;
			break;
		case 2://7 bit
			endchar=0x7f;
			break;
		case 3://8 bit
			endchar=0xff;
			break;
		default:
			endchar=0xff;
			break;
	}
	printf("press space to begin\n");
	for (k=0; k < 8; k++)
		{
		 BQueInit(ptrqueue[k],2000,buf[k]);
		}

	outportb(0x20, 0x20);
	outportb(0xa0, 0x20);

	for (k=0; k < 8; k++)
	   {
		outportb(BaseAdr+portadr[i]+LCR, inportb(BaseAdr+portadr[i]+LCR) & 0x7f);
		while ((inportb(BaseAdr+portadr[i]+LSR) & 0x01) == 0x01)
			 inportb(BaseAdr+portadr[i]);
		outportb(BaseAdr+portadr[i]+IER, 0x00);
	   }
	Inter_txrx(intvet);

   while (1)
	  {
	   if (pause == 0)
		  {
		   for (k=0; k < 8; k++)
			  {

		  //while(inportb(BA[0]+LSR) & 0x01)
		   while (ptrqueue[k]->count > 0)
			  {
			   //c=inportb(BA[0]+RBR);
			   c=BQueGet(ptrqueue[k]);
			   if (c == 0x00)
				  { ps[k]=STARTRECIEVE;expectchar=0x02;continue;}
			   if (c == 0x01)
				  {
				   ps[k]=STARTSEND;
				   if(display) printf("\n");
				   recloop[k]++;
				   if (recloop[k] > 30)
					  {
					   recloop[k]=0;
					   if(display==0) printf("1");
					  }
				   continue;
				  }
			   if (ps[k] == STARTRECIEVE)
				  {
				   if (display) printf("%x ",(unsigned char)c);
				   if (expectchar != c)
					  {
					   printf("error %02x %02x\n",expectchar,c);
					   error=1;
					  }

				   expectchar++;
				  }
			  }
		  //	}

		 //for (k=0; k < 8; k++)
		   //	  {

		if (ps[k] != NONE)
		   {
			if (ps[k] == STARTSEND)
			   {
				SendChar(0,0x00);
				ps[k]=SENDING;
				sendchar[k]=0x02;
			   }

			if (ps[k] == SENDING)
			   {
				SendChar(0,sendchar[k]);
				if (sendchar[k] != endchar) sendchar[k]++;
				else 				    ps[k]=ENDSEND;
			   }
			if (ps[k] == ENDSEND)
			   {
				SendChar(0,0x01);
				ps[k]=NONE;
			   }
		   }
		}
		}
	 if(kbhit())
	 {
		tt=getch();
		if(tt==27) break;
		if(tt==' ') {ps[0]=STARTSEND;sendchar[0]=0x02;};
		if(tt=='p') pause=1-pause;
	 }
	 return 0;
   }
 */
int main(int argc, char **argv)
{
	 unsigned  char rtl[4];
	 unsigned  char ttl[4];
	 unsigned  char ritl[4];
	 unsigned  char titl[4];
	 unsigned  char ccpb[4];
	 unsigned  char pcitest[3];
	 int   testmode=2;
	 char  bautrat[8]="B19200";
	 modevar=6;
	 portsend=0;
	 display=1;
	 re_rec=0;
	 //cks54=0x20;
	 //acr43=0;
	 tcr30ccpb=0x00;/*0--16 clock cycle per bit*/
	 fcr54titl=0x00;/*0--16 transmit interrupt trigger level*/
	 lcr10dl=3;  /*3--8bits data length of serial characters*/
	 lcr2nos=0;  /*0--1bit number of stop bits per serial charater*/
	 lcr53pt=0x00;  /*0-no parity po pe p1 p0*/
	 titl950=0x30;
	 fcr76rtl=0x00;
	 titl650=0x20;
	 rtl650=0x10;
	 rtl950=0x30;
	 gstep=20;
	 gstepn=20;
	 loopbackb=0;

⌨️ 快捷键说明

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