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

📄 main.c

📁 读卡器源码
💻 C
字号:
#include <stdio.h>
#include <reg51.h>
#include "driver.h"
#include "sle4442.h"


main(void)
{
    //系统初始化

    //串口初始化
    UART_INIT();

    while(1)
    {
        ComTran();
    }


}
/******************************************************
功能:串口初始化
入口参数:无
出口参数:无
******************************************************/
void UART_INIT()
{
    SCON = 0X50;
    TMOD = 0X21;
    PCON |= 0X80;
    TH1=TL1=FDH;

    ES = 1;
    EA = 1;
}
/******************************************************
功能:串口uart接收中断
入口参数:无
出口参数:无
*******************************************************/
void UART_ISR(void) interrupt 4 
{
    if((RI)&&(TI))
    {
        if (iend<255)
        {
            buffer[iend++] = SBUF;
            unlen++;
        }
        while(!TI)//等待发送完成
        TI=0;//清除发送标志
        RI=0;//清除接收标志
    }
}
/*****************************************************
功能:发送数据

*****************************************************/
void UartSndByt(U8 bb)
{
    TI= 0;         
	SBUF= bb;
	while(!TI);
	 return
}
/***************************************************
功能:接收过程处理,返回处理结果
输入: 
this:指针
keycode:键值
输出: 无
返回: 无
***************************************************/
void ComTran(void)
{
        U8 uu;
        uu = ComRecive(0x05, 0x00);///等待出发
		if(uu == 0x00)
		{ 

			//Send_len = SendPtr = 0x00;
ComFlag:
			
			uu =  comb();

			if(uu != 0)
			{
				if(uu == 0x80)
					goto  ComFlag; ///重做
				//FanHuiERR(uu);   //返回错误代码				  
			}
			else  
				//FanHuiComc( 0,Send_len, Zhj+SendPtr); 
				1=1;
			
		}
		else
			FanHuiERR(uu);   //返回错误代码	

}
U8 ComRecive(uchar Mode, uchar pno)
{
    snd = 0 ;
RceString :
    //time = TimVal; 
    istar = iend = unlen = 0;
    coml = 0x00;
  	   
    while(1)
    {   
           while(unlen!=0)
           {
               bb =  buffer[istar];
               unlen--;  istar++;

               switch(coml)
               {
               case 0x00:	   //开始接受 0x1B 'N' 'U'
                   CHead1 = bb; coml = 1;                       
                   break;
               case 0x01:	   //开始接受 0x10
                   CHead2 = bb; 
                   coml = 2; 
                   break;
               case 0x02:	   //开始接受 关键字或NP:0
                   CKey = bb;    
                   if(CHead1 == 0x1b && CHead2 == 0x10)///1b 10
                       Mode = 5 ;
                   if(Mode == 5)///0x1b
                       coml = 3;  ///
                   else
                       coml = 4;  ///NP
                   break;
               case 0x03:
                   CNo = bb;   //数据包序号
                   coml = 4;
                   break;
               case 0x04:	   //开始接受 命令长
                   CLen = bb;   //命令长度
                   datalen = 0x00; //命令数据长度(不包含命令头字节,含校验)
                   coml = 5;
                   break;
               case 0x05:	   //开始接受数据
                   if(datalen + Mode >= CLen)
                   {			        
                       coml = 6;
                       verr.byte[1] = bb; //接收校验位高位 
                       break;
                   }
                   if(datalen + Mode < CLen)
                   {
                       if(Mode != 5) ///NP
                           CNo = bb;   //数据包序号 NP
                       else  if(snd+datalen < ZhMax)///ZhMax = 528
                           Zhj[snd+datalen] = bb;
                       datalen++;
                   }
                   break;
               case 0x06:							  	  
                   ES = 0;           //关串口中断                 
                   verr.byte[0] = bb;//接收校验位低位		 
                   if(Mode == 0x05)///0x1b 0x10 
                   {
                       if(CHead1 != 0x1b || CHead2 != 0x10)
                       {
			               ES = 0;           //关串口中断              //modi wanjun    
                           return 0X21; ///包头措
                       }
                   }
                   /////////				  	  
                   //if(verr.inter  != 0x00)
                   if(cal_crc(buffer, CLen) == verr.inter )
                   {
                       if(Mode == 0x05)///0x1b 0x10 
                       {
                           snd += datalen;
                           if(CNo != 0x00)
                           {
                               //send_NP(CNo);
                               goto RceString ; ///接收其余包
                           }
                           else  
                           {
                               return 0x00;
                           }
                       }
                       else ///(NP ER)
                       {
                           if(CHead1 == 'N' && CHead2 == 'P' )
                           {
                               ES = 0;           //关串口中断             //add by wanjun 
                               if(CNo == pno)
                                   return 0X04;   //这个时干什么得,不知道
                               else                        //这个是干什么得,不知道
                                   return  0X05;
                           }	    
                           else////错误 
                           {
                               ES= 0;           //关串口中断              //add by wanjun    
                               return 0X1F;
                           }
                       }  		  	   	
                   }
                   else
                   //{
                       ES = 0;           //关串口中断             //add by wanjun   
                       return 0X1F;//校验位错
                   //}
               }

               time = 0x4ffff;		 
           }
/****************************************************************           
                  ///////////超时
                  if(Mode == 0x05 && coml > 0 )
                  {
                      if(time-- == 0)//超时
                      {
                          ES = 0;           //关串口中断 //add by wanjun    
                          bb = 0x00 ;
                          if(coml < 5)
                          {
                              bb =  PacketLenER;
                          }
                          else
                          {
                              if(CHead1 != 0x1b || CHead2 != 0x10)
                                  bb = PacketER;
                              else
                              {
                                  verr.inter = cal_crc(buffer, istar-2);
                                  if((verr.byte[0] != buffer[istar-1]) || (verr.byte[1] != buffer[istar-2]))//通过校验
                                      bb = MarkByteER;
                                  else
                                      bb = PacketLenER;
                                  
                              }
                          }
                          ES = 0;           //关串口中断              //add by wanjun    
                          return bb;  ///返回
                      }
                  }	
                  */
     };
     return 0x00;
}
///////////////////////////////////
//命令处理
///////////////////////////////////
U8 Comb(void)
{
	unsigned char i,j = 0,a = 0,cc , wi,ch;//接收卡返回的数据长//unsigned long vv;
	unsigned int  tt,suml,sedl;
	unsigned long xx;


	
	switch(CKey)
	{
        case 00:///注册

		   break;
	   
	    case 01://分发一卷发票
		
            break;
	default:
		return 1;
	 }
	 return 0;
}
U8 CheckXor(const char *pData, int iLen)
{
	char cXor = 0;

	for(int i=0; i<iLen; i++)
	{
		cXor ^= pData[i];
	}

	return cXor;
}

⌨️ 快捷键说明

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