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

📄 uart.c

📁 一个具体的项目程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include  "My_head.h"
#include  "MyProtocol.h"
#include  "carddef.h"
#include  "DS_addr.h"
#include  "DataFlash.H"
/****************************************************/
#define   DE_RE           P3_6
#define   UARTBUF_SIZE    180
//===================================================
BYTE  code   TieUpBus_Ordors[4]={0xAA,0X55,0x55,0xAA};
BYTE  code   BoardCast_ADDR[2]={0xAA,0xFF};

BYTE  xdata  uartSbuf[UARTBUF_SIZE];
BYTE  pdata  uartRbuf[UARTBUF_SIZE];
static  BYTE  uartRbuf_count = 0;
bit   my_ti = FALSE;
bit   dowith_receive_flag = FALSE;

BYTE  idata  receive_head[4];
BYTE  receive_head_counte =0;
BYTE  receive_timer = 0;
BYTE  enble_send_count = 0;
//===================================================
void  Uart_Int(void) interrupt 4 using 2
{
   bit  no_my_data_flag= FALSE;
   register  BYTE  ch;
   if(RI)
     {
	  RI = FALSE;enble_send_count = 2;
	  ch = SBUF;
	  /**************** test ***********
      if(uartRbuf_count<UARTBUF_SIZE)
	    {
	     uartRbuf[uartRbuf_count++] = ch;
	    }
  	  if(uartRbuf_count>ORDOR_PLACE)
	    {
	     dowith_receive_flag = TRUE; //this is a test!
		}
	  /**********************************/
	  if(!receive_timer)
	    {
		 receive_timer=2;
		 receive_head_counte=0;
		}
      if(receive_timer<3)
	    {
	     receive_head[receive_head_counte]=ch;
		 if(++receive_head_counte>3)
	  	   {
            if(  (receive_head[0]!=TieUpBus_Ordors[0])
			   ||(receive_head[1]!=TieUpBus_Ordors[1])
		       ||(receive_head[2]!=TieUpBus_Ordors[2])
			   ||(receive_head[3]!=TieUpBus_Ordors[3]))
			   {
			    receive_timer=0;
				//receive_head_counte=0;
			   }
			else{
			     receive_timer=45;
				 uartRbuf_count=0;
			     //receive_head_counte=0;
				 //dowith_receive_flag = TRUE; //for test.
			    }
		   }
		 return;
		}
	  if((receive_timer<10)||(receive_timer>45))
	    {
		 receive_timer=0;
		 return;
		}
	  //=================================================================
      if(uartRbuf_count<UARTBUF_SIZE)
	    {
	     uartRbuf[uartRbuf_count++] = ch;
		 ch = uartRbuf_count-1;
	    }
	  else ch = uartRbuf_count;
	  switch(ch)
	  {
	   case  ASP_PLACE:
		     if(uartRbuf[ch] != DOWN_ASP)
			  {
				no_my_data_flag = TRUE;
			  }
			 break;
	    case TYPE_PLACE:
			 if(uartRbuf[ch] != equip_addr.ntype)
			  {
				no_my_data_flag = TRUE;
			  }
  			 //dowith_receive_flag = TRUE; //this is a test!
			 break;
		case NUMBER_PLACE1:
  		      if((uartRbuf[ch] != ((BYTE *)(&equip_addr.number_addr))[0])
			     &&(uartRbuf[ch] != BoardCast_ADDR[0]))//并且不等于广播地址
			  {
				no_my_data_flag = TRUE;
			  }
			  break;
		 case NUMBER_PLACE2:
			  if((uartRbuf[ch] != ((BYTE *)(&equip_addr.number_addr))[1])
  			      &&(uartRbuf[ch] != BoardCast_ADDR[1]))//并且不等于广播地址
			  {
				no_my_data_flag = TRUE;
			  }
			  break;
         case DATLENGTH_PLACE:
			  if((uartRbuf[ch]<FRAMELENGTH_MIN)||(uartRbuf[ch]>FRAMELENGTH_MAX))
			  {
				no_my_data_flag = TRUE;
			  }
			  break;
		 default:
			  if((ch>ORDOR_PLACE) && (ch>=uartRbuf[DATLENGTH_PLACE]))
		 	  {
				 REN = FALSE;  //for run-time!
		         dowith_receive_flag = TRUE;
			  }
			  break;
	   }
      if(no_my_data_flag)
	   {
		 REN=FALSE;  //for run-time!
         receive_timer=1;
		 receive_head_counte=0; //MUST!!
		 //uartRbuf_count=0;
	   }
	  /********************************/
     }
   if(TI){my_ti=TI=FALSE;}
}


/*************************************************************/
/*       uart_send                                           */
/*************************************************************/
void  Uart_Putc(BYTE  ch)
{
   while(my_ti);
   SBUF = ch;
   my_ti= TRUE;
}


bit  SendStr(BYTE *ptr,int  count)  //"BYTE"  modiry to "int" by 2004-6-18
{                                   //"void"  modify "bit"  by  2004-07-08
  int  i;
  //if(count>512)return;
  Set_Timer20ms(5);
  while(enble_send_count)if(!Get_Timer20ms())return(FALSE);
  REN   = FALSE;
  DE_RE = 0;
  TB8   = 1;
  for(i=0;i<count;i++)
    {
	 //Save_My_TestData(ptr[i]);
	 Uart_Putc(ptr[i]);
	}
  delay_ms(2);//must for RS485!
  DE_RE = 1;
  REN   = TRUE;
  return(TRUE);
}


/*************************************************************/
void  UartBuf_Clear(void)
{
   BYTE   i=0;
   for(;i<UARTBUF_SIZE;i++)uartRbuf[i]=0;
   uartRbuf_count=0;
   dowith_receive_flag = FALSE;
   my_ti = FALSE;
}


void  Uart_Init(void)
{
   TR1   = 0;
   IP   |= 0X10;   // ES优先级1
   //SCON  = 0x50;   // 8位UART,波特率可变 REN=1
   SCON  = 0xF0,TB8=1;   // 9位UART,波特率可变 REN=1,摸停止位。
   TMOD &= 0x0f;   // 方式寄存器
   TMOD |= 0x20;   // T1设为自动再装入8位计数器,或者分成2个8位计数器
   ES    = 1;      //(ES为串行口中断允许位)
   TH1=TL1=0xFA;   // 0xfA--9600bps(22.1184Mhz)
   PCON |= 0x80;   // PCON.7为波特率加倍,PCON的其他位为掉电控制位
                   // 2004-7-21改为波特率19200
   TR1 = 1;        // TCON |= 0x40;

#if(MCU_IC==SST564)  //EXTRAM = AUXR^2;
   AUXR  &= ~0x02;   //0: Internal Expanded RAM access.
#elif(MCU_IC==SM5964)//OME = SCONF^2;
   SCONF |= 0x02;    //1: default is enable.
#endif

   DE_RE = 1;
   UartBuf_Clear();
   //delay_ms(1);
}


bit  Check_BCCsum(BYTE *buf)
{
  BYTE len,BCC_sum;//ii;
  for(BCC_sum=0,len=0;len<buf[DATLENGTH_PLACE];len++)
   {
     BCC_sum ^= buf[len];
   }
  if(~BCC_sum != buf[len])return(FALSE); //CRCERR;
  return(TRUE);
}


void  Set_BCCsum(BYTE *buf,BYTE nCount)
{
    BYTE   ii;
    for(buf[nCount]=0,ii=0;ii<nCount;ii++)
	{
	  buf[nCount]^=buf[ii];
	}
	buf[nCount]=~buf[nCount];
}


/*****************************************************
BYTE  Do_Uart_Event(BYTE dat)  //这样可以把uartSbuf节约出来?
   {
    PostMessage(MY_UART_EVENT,0);
    dowith_receive_flag = FALSE;
	return(TRUE);
   }
/*---------------------------------------------------*/
bit   close_dis_led = FALSE;
bit   Check_Uart_Event(void)
{
   BYTE  len;//,BCC_sum;//ii;
   if(!dowith_receive_flag)
   {
	 if(receive_timer && !close_dis_led)
	   {
		 Dis_Comming_Led(TRUE);//0-close;1--open.
		 close_dis_led = TRUE; //for time and spi bus.
	   }
	 else if(close_dis_led)
	   {
	     Dis_Comming_Led(FALSE);//0-close;1--open.
	     close_dis_led = FALSE; //for time and spi bus.
	   }
	 return(FALSE);
   }

   memcpy(uartSbuf,uartRbuf,uartRbuf_count);
   len=uartRbuf_count,uartRbuf_count = 0;
   dowith_receive_flag = FALSE;
   receive_timer  = 45; //for continue!
   REN = TRUE;
   if(uartSbuf[FRAMECODE_PLACE]&THELAST_FRAME)
   {
     receive_timer = 0; //for renew  the head str!
   }
   /***********this is a test!!************************
   Set_BCCsum(uartSbuf,uartSbuf[DATLENGTH_PLACE]);
   SendStr(uartSbuf,len);//REN = TRUE;
   do_buzzer(1);
   /***************************************************/
   if(!Check_BCCsum(uartSbuf))return(FALSE);//CRCERR;
   //do_buzzer(1);
   //SendStr("OK",2);
   switch(uartSbuf[ORDOR_PLACE])
   {
	case CHECKEQUIP_ORDOR://         0x50
         Do_CheckEquip(Equip_CurStatus);
		 break;
	case SetNumber_ORDOR://          0x52
	     Do_SetNumber();
	     break;
	case GetNumber_ORDOR://          0x99
	     Do_GetNumber();
	     break;
    
	//自动充值数据
	case SetAutoGainCards_ORDOR://	 0xC5
		Do_SetAutoGainCards();
		break;
	case GetAutoGainCards_ORDOR://	 0xC6
		Do_GetAutoGainCards();
		break;
	//自动充值限制
	case SetAutoGainParam_ORDOR://    0xC7
		Do_SetAutoGainParam();
		break;
	case GetAutoGainParam_ORDOR://    0xC8
		Do_GetAutoGainParam();
		break;
    //=========================================

	case ClearConParam_ORDOR://      0x57
	     Do_ClearConParam();
	     break;
	case SetBh_Money_ORDOR://  	     0x58
        // Do_SetBh_Money();
		 break;
	case GetBh_Money_ORDOR://        0x59
        // Do_GetBh_Money();
		 break;
	case SendDcpeoples_ORDOR://	     0x5A
	    // Do_SendDcpeoples();
	     break;

	case SetSystemTime_ORDOR://      0x60
	     Do_SetSystemTime();
		 break;
   	case GetSystemTime_ORDOR://      0x61
	     Do_GetSystemTime();
		 break;

	case SetLostCardTime_ORDOR://    0x63
	     //Do_SetLostCardTime();
		 break;
	case GetLossCardsTime_ORDOR://   0x64
	    // Do_GetLossCardsTime();
		 break;
    /************************************/
	case SendCardStatus_ORDOR://     0x62 
	     Do_SendCardStatus();
		 break;
	case GetCardStatus_ORDOR://      0x65
	     Do_GetCardStatus();
         break;
    /************************************/
	case ReadConData_ORDOR://        0x70
         Do_ReadConData();
		 break;
	case SetConRecode_ORDOR://       0x71
	     Do_SetConRecode();
		 break;
	case SendCardGain_ORDOR://       0x72
	     //Do_SendCardGain();
		 break;
	case GetCardGain_ORDOR://        0x73
         //Do_GetCardGain();
	     break;
	case GetConStatusInfo_ORDOR://     0x75
         Do_GetConStatusInfo();
		 break;
	case GetEquipVersionInfo_ORDOR://  0x76
         Do_GetEquipVersionInfo();
		 break;
	/**************************************/
	case GetCardLevel_ORDOR://         0x80
	     //Do_GetCardLevel();
		 break;
	case SetSeedCard_ORDOR://          0x81
	     //Do_SetSeedCard();
	     break;
	case GetUserCardInfo_ORDOR://      0x82
	     //Do_GetUserCardInfo();
		 break;
	case SetUserCardInfo_ORDOR://      0x83
         //Do_SetUserCardInfo();
		 break;
	/**************************************/
	case SetOpUserInfo_ORDOR://        0x90
	     //Do_SetOpUserInfo();
		 break;
	case GetCurOpUserInfo://           0x91
	    // Do_GetCurOpUserInfo();
		 break;
	case GetOpUserInfo://              0x92
	     //Do_GetOpUserInfo();
		 break;
	default:break;
   }

   return(TRUE); //len
}


void   Do_CheckEquip(BYTE dat)
{
    BYTE  nCount            = ASP_PLACE;
    uartSbuf[ASP_PLACE]     = UP_ASP;
	uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
	uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
	uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
	//uartSbuf[DATLENGTH_PLACE]=
	//uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
	uartSbuf[ORDOR_PLACE]    = EQUIPANSWER_ORDOR;//0x51,所有重要数据都对方需要回答
    nCount   = DATAST_PLACE;
	uartSbuf[nCount++] = dat;//Equip_CurStatus; //最近运行情况。
	uartSbuf[DATLENGTH_PLACE] = nCount;

    Set_BCCsum(uartSbuf,nCount);
    if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
}


//恢复设备到初始出厂状态。
void  Do_ClearConParam(void) 
{
    BYTE  nCount,dat = SUCCESS;
	if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE != 0)
	{
	  dat = FORMAT_ERR;
	}
    else
    {
      dat=ClearConParam_From_Mem(); //恢复到初始出厂状态。
	}
    uartSbuf[ASP_PLACE]     = UP_ASP;
	uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
	uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
	uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
	//uartSbuf[DATLENGTH_PLACE]=
	//uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
	uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
    nCount   = DATAST_PLACE;
	uartSbuf[nCount++] = dat;
	uartSbuf[DATLENGTH_PLACE] = nCount;

    Set_BCCsum(uartSbuf,nCount);
    if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);

	if(dat==SUCCESS)
	{
	   //Dis_ConMode();
	   do_buzzer(BUZZER_WAIT);
	}
}

//设置自动充值参数
void Do_SetAutoGainParam(void)
{
    BYTE  nCount = ASP_PLACE;
    BYTE  dat = SUCCESS;

	if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE<sizeof(sttFillLimitInfo))
	  dat = FORMAT_ERR;
    else
      dat=WriteFillLimitInfo((sttFillLimitInfo*)&uartSbuf[DATAST_PLACE]);

    uartSbuf[ASP_PLACE]     = UP_ASP;
	uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
	uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
	uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
	//uartSbuf[DATLENGTH_PLACE]=
	//uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
	uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
    nCount   = DATAST_PLACE;
	uartSbuf[nCount++] = dat;
	uartSbuf[DATLENGTH_PLACE] = nCount;

    Set_BCCsum(uartSbuf,nCount);
    if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);

	if(dat==SUCCESS)
	{
	   //Dis_ConMode();
	   do_buzzer(BUZZER_WAIT);
	}
}



//读取自动充值参数
void Do_GetAutoGainParam(void)
{
    BYTE  nCount = ASP_PLACE;
    uartSbuf[ASP_PLACE]     = UP_ASP;
	uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
	uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
	uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
	//uartSbuf[DATLENGTH_PLACE]=
	//uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
	uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
    nCount   = DATAST_PLACE;
	ReadFillLimitInfo((sttFillLimitInfo*)&uartSbuf[DATAST_PLACE]);
    //dat=restoreparam_from_Mem();
    //memcpy(&uartSbuf[DATAST_PLACE],&stOrderDinnerTimeList,sizeof(stOrderDinnerTimeList));
    nCount+=sizeof(sttFillLimitInfo);
	uartSbuf[DATLENGTH_PLACE] = nCount;

    Set_BCCsum(uartSbuf,nCount);
    if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
}


void  Do_SetSystemTime(void)
{
    BYTE  buf[7];// = {0x00,0x45,0x23,0x16,0x06,0x03,0x04};
    BYTE  nCount;

⌨️ 快捷键说明

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