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

📄 comm.c

📁 c8051f310xmodembootloader.rar
💻 C
字号:
#include "global.h"


unsigned char xdata TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
unsigned char xdata *inTxBuf,*outTxBuf, *inRxBuf,*outRxBuf;//收发缓冲区读写指针
//inRxBuf指向收的收,outRxBuf指向收缓冲区的读。
bit TIflag=1;//Note:It must be 1.




/******************************************************************************
** 函数: UART0_Init()
** 入参: 
** 返回: 
** 说明:
** UART0_Init
** Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
******************************************************************************/

void UART0_Init (void)
{
   SCON0 = 0x50;                       // SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
      CKCON |=  0x08;
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01                  
      CKCON |=  0x09;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   } else {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   }

   TL1 = TH1;                          // init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;                       
   TR1 = 1;                            // START Timer1
   Buff_Init();

}

/******************************************************************************
** 函数: Buff_Init (void)
** 入参: 
** 返回: 
** 说明: 
******************************************************************************/
void Buff_Init (void)
{

    inTxBuf=TxBuf;outTxBuf=TxBuf;
	inRxBuf=RxBuf;outRxBuf=RxBuf;
	EA=1;ES0=1;

}

/******************************************************************************
** 函数: UATR0_ISR()  interrupt
** 入参: 
** 返回: 
** 说明:  interrupt 4
******************************************************************************/

void serial(void) interrupt 4
{ 
 
   unsigned char *t;

if(TI0) 
      {	
		 TI0=0;
        if(inTxBuf==outTxBuf) {TIflag=1;return;}//TxBuf Empty
		SBUF0=*outTxBuf; outTxBuf++;
		if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
	  }


if (RI0)
      { 	
		RI0=0;
        //这里,缓冲区的读写方式跟8019as的ram区一样,是循环读,而且也用了
		//两个指针,一个用来收,一个用来读
		t=inRxBuf;t++;				//保留指针位置
		if(t==RxBuf+LenRxBuf) t=RxBuf;	//如果到缓冲区末尾,则返回缓冲区头
		if(t==outRxBuf) return;			//如果相等,说明缓冲区满了,RxBuf Full
		*inRxBuf=SBUF0;
		inRxBuf=t;

       }
       

}

/**********************************************************************
** 函数原型:    void  	Printf_Char(u8_t ascii)
** 参数说明:	ascii:	发送到串口的ASCII
** 返 回 值:	无      
** 说    明:	往串口发送一个字符
************************************************************************/

void Printf_Char(unsigned char ascii)
{
	unsigned char *t;

	ES0=0;
	if(TIflag)
	{
		TIflag=0;
		TI0=1;
	}
	t=inTxBuf;t++;
	if(t==TxBuf+LenTxBuf) t=TxBuf;
	if(t==outTxBuf) {ES0=1;return;}			//TxBuf Full
	*inTxBuf=ascii;
	inTxBuf=t;
	ES0=1;
}


/**********************************************************************
** 函数原型:    void  		Printf_String(u8_t code *string)
** 参数说明:	string:	字符串的起始地址
** 返 回 值:	无      
** 说    明:	向串口发送字符串,碰到0x00结束
************************************************************************/
void Printf_String(unsigned char  *string)
{

   while(*string!=0)
   {
     Printf_Char(*string);
     string++;
   }
}

/**********************************************************************
**函数原型:    Get_Char()
**参数说明:	无
**返 回 值:	temp      
**说    明:	从串口缓冲区接收一个字符
************************************************************************/
bit Get_Char(unsigned char xdata *ch)
{
 
	ES0=0;
	if(inRxBuf==outRxBuf) {ES0=1;return 0;}   	//RxBuf Empty
	*ch=*outRxBuf;  outRxBuf++;					//数据被读走,读指针加1
	if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;	//如果读指针到缓冲区尾部,则返回到头部
	ES0=1;
	return 1;

}

/**********************************************************************
**函数原型:    process_uart
**入口参数:		com_len
**出口参数:		无
**返 回 值:	无
**功能说明:		接收上位机的配置,检测串口有数据,等待一帧数据结束处理
***********************************************************************/

void process_uart()
{
  unsigned char dat_len=0;
  unsigned char xdata ch;

  while(Get_Char(&ch))
  {
     delayms(2);
     combuf[dat_len]=ch;
	 dat_len++;
	 if(dat_len==maxlen+1) dat_len=0;
	  if(dat_len==32)				   //简单的利用串口长度来确认帧到来
	  {
		 if((combuf[30]==0x55)&&(combuf[31]==0xaa))
		 {
		   dat_len=0;
		   process_incmd();			   //处理串口接收的配置表
		 }
		 else
	     { 
		   dat_len=0; 				   //不处理
	     }
	  }
	  
	   
  }
 
}


/**********************************************************************
**函数原型:    process_incmd
**入口参数:		无
**出口参数:		无
**返 回 值:	无
**功能说明:		处理接收的PC命令
***********************************************************************/

void process_incmd()
{

  READER_PCS xdata *pcs;

  pcs=(READER_PCS xdata *)(combuf);

  switch(pcs->pcs_cmd)
  {
   	case PCS_read_READER:
	     PCS_r_reader();		            //pc命令上传读卡机参数
	     break;

    case PCS_read_TAG:
	     PCS_rw_tag(PCS_read_TAG);		    //pc命令上传微波卡参数
	     break;

    case PCS_write_READER:		            //pc命令配置读卡机参数
	     PCS_w_reader();
	     break;

	case PCS_write_TAG:
     	 PCS_rw_tag(PCS_write_TAG);		    //pc命令配置微波卡参数
	     break;

	default:
	     break;
    
  }

}
/**********************************************************************
**函数原型:    PCS_r_reader()
**入口参数:		none
**出口参数:		none
**返 回 值:	none
**功能说明:		PC命令读基站参数
***********************************************************************/
void PCS_r_reader()
{
   uchar i;

   READER_PCS xdata *poreader;
   poreader=(READER_PCS xdata *)(combuf);


   memcpy(combuf+4,MyID,sizeof(MyID));
   
   
   for(i=0;i<8;i++)
   {
     if(power==pow[i])
	 {
	   poreader->pcs_power=i;	          //查功率ItemIndex值
	   break;		  
	 }
   }
    
   

   for(i=0;i<8;i++)
   {
     if(INACTIVITY_TIME==cardouttime[i])
	 {
	   poreader->pcs_samecardtime=i;	  //查相同卡号输出间隔时间ItemIndex值
	   break;		 
	 }
   }
    


   for(i=0;i<8;i++)
   {
     if(RELAY_TIME_IN ==relay_time[i])    //查继电器动作延时时间ItemIndex值
	 {
	   poreader->pcs_relaytime=i;
	   break;		 
	 }
   }
   

   for(i=0;i<4;i++)
   {
     if(wiefmt==wie[i])                   //查韦根格式ItemIndex值
	 {
	   poreader->pcs_wieformat=i;
	   break;		 
	 }
   }


   for(i=0;i<32;i++)
   {
    Printf_Char(combuf[i]);
   }
   BELL_ON;
   delayms(1000);
   BELL_OFF;


}
/**********************************************************************
**函数原型:    tag_r_reader()
**入口参数:		none
**出口参数:		none
**返 回 值:	none
**功能说明:		tag reply 
***********************************************************************/
void tag_r_reader()
{
  uchar i;
  memcpy(combuf+2,rxdata+1,26);

   for(i=0;i<32;i++)
   { 
    Printf_Char(combuf[i]);
   }
   BELL_ON;
   delayms(1000);
   BELL_OFF;
}
/**********************************************************************
**函数原型:    PCS_w_reader()
**入口参数:		none
**出口参数:		none
**返 回 值:	none
**功能说明:		PC命令写基站参数
***********************************************************************/
void PCS_w_reader()
{
	 uchar i;
 	 READER_PCS xdata *pcs;
	 pcs=(READER_PCS xdata *)(combuf);

     wiefmt=wie[pcs->pcs_wieformat];					  //提取RAM更改参数
     power =pow[pcs->pcs_power];
     INACTIVITY_TIME=cardouttime[pcs->pcs_samecardtime];
     RELAY_TIME_IN  =relay_time[pcs->pcs_relaytime];
     RELAY_TIME_OUT =relay_time[pcs->pcs_relaytime];
     memcpy(MyID,pcs->pcs_readerid,4);					  //赋值系统ID
     pcs->pcs_crc16=cal_crc(combuf,sizeof(READER_PCS)-2); //计算CRC
     memcpy(combuf,pcs,sizeof(READER_PCS));	   //计算好的参数回COPY内存,结构体不能传递指针
     flash_save(combuf,F_ADDR,32);             //保存数据至flash;
     delayms(100);					           //重新配置SI芯片
     nres=0;
     delayms(100);
     nres=1;
     ia442xinit();
     spirevtwobyte();
     spisendcommand(0x8288);			    //电源管理 whole receive crystal on
     spisendcommand(0xca83);				//FIFO COMMAND


	 combuf[3]= PCS_wr_OK;
	 for(i=0;i<32;i++)
     {
      Printf_Char(combuf[i]);			    //基站参数配置成功
     }
   BELL_ON;
   delayms(1000);
   BELL_OFF;
}
/**********************************************************************
**函数原型:    PCS_w_tag()
**入口参数:		none
**出口参数:		none
**返 回 值:	none
**功能说明:		PC命令上传或者写卡参数
***********************************************************************/
void PCS_rw_tag(uchar cmdm)
{
    uchar i;
    ULONG idata sum;
    UINT  result;
    CMD_TAG xdata *pct;
	READER_PCS xdata *pcs;

    pcs=(READER_PCS xdata *)(combuf);	//pcs指针指向解析的PC命令帧
	pct=(CMD_TAG xdata *)(txdata+4);	//pct指针指向发送的命令帧

	memcpy(txdata, SiHead, 4);          //同步头
    pct->data_len=sizeof(CMD_TAG)-1;	//数据长度
	pct->cmd=cmdm; 				       //命令
	memcpy( pct->reader_id,pcs->pcs_readerid,4);  //4字节基站
	memcpy(pct->tag_id, pcs->pcs_tagid, 6); 	  //6字节卡号

	pct->tag_cenfre=pcs->pcs_cenfre;              //中心频率
    pct->tag_power=pcs->pcs_power;                //功率	   有效
	pct->tag_bud=pcs->pcs_bud;                    //波特率
	pct->tag_flaginout=pcs->pcs_flaginout;	      //进出标记
	pct->tag_tagantitime=pcs->pcs_tagantitime;	  //anti
	pct->tag_tagchgflagtine=pcs->pcs_tagchgflagtine; //chgtime

	for(i=0;i<8;i++)
	{
	 pct->tag_buf[i]=0;				               //预留补0   
	}

  	pct->skey[0]=0xff;					   //处理密钥
    pct->skey[1]=0xff;
    pct->skey[2]=0xff;
    pct->skey[3]=0xff;
    sum = (ULONG)cksum(txdata+4,sizeof(CMD_TAG)-2-1);	  //从长度开始算SUM
    result = (UINT)(sum + (sum >> 16));
    pct->crc=result;		 


      
	   for(i=0;i<10;i++)
	   {
	       txregframe(sizeof(CMD_TAG));
		   delayms(50);   
	   }

	
}


/**********************************************************************
**函数原型:    Hex2Asc
**入口参数:		*chrDest  *Hex	 Len
**出口参数:		无
**返 回 值:	无
**功能说明:		十六进制转字符
***********************************************************************/

/*
void Hex2Asc(unsigned char *chrDest,const unsigned char *Hex,unsigned int Len)
{

unsigned char *ASC = chrDest ;
unsigned int i,n1,n2;
unsigned char chrTmp[] = "0123456789ABCDEF";

for (i = 0;i < Len;i++) 
{ 
     n1 = ((*(Hex+i)) >> 4) & 0x0F ;
   *(ASC+i * 2) = *(chrTmp+n1) ;
     n2 = (*(Hex+i)) & 0x0F ;
   *(ASC+i * 2 + 1) = *(chrTmp+n2);
} 
ASC[i * 2] = '\0';
return ;
}
*/
/****************************@end@*************************************/

⌨️ 快捷键说明

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