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

📄 main.c

📁 RFID 函数接口的部分设计
💻 C
📖 第 1 页 / 共 3 页
字号:
	  if (Timer0Cnt)
	  {
		--Timer0Cnt;
	  }
	  else
	  {
		STOP_T0();
	
	#ifdef AUTODELAY
		if (DelayRate < MAXDELAYRATE && CmdCnt > 0)
		{
		  DelayRate++;
		  DelayRateLocked = FALSE;
		}
	#endif
	
		RecvState = RECV_STX;
	
		if (!SendReady && LLfReady)
		{
		  if (RepCnt < MAXREPCNT)
		  {
			RepCnt++;
			CALL_isr_UART();
		  }
		  else
		  {
			RepCnt = 0;
			Quit = FALSE;
			SendReady = TRUE;
		  }
		}
	  }
	}
	
	
	/****************************************************************************
	*                                                                           *
	* Function:     isr_UART                                                    *
	*                                                                           *
	* Input:        -                                                           *
	* Output:       -                                                           *
	*                                                                           *
	* Description:                                                              *
	*                                                                           *
	* Diese Interrupt-Funktion wird vom UART aufgerufen und bearbeitet das      *
	* serielle Protokoll.                                                       *
	*                                                                           *
	****************************************************************************/
	
	void 	isr_UART (void) interrupt 4 using 1
	{
	  uchar c, i, j, len, cmd;
	  uchar oldRecvState, chk;
	
	  if (RI)
	  {
		STOP_T0();
	
		c  = SBUF;
	
		RI = FALSE;
	
		oldRecvState = RecvState;
		RecvState = RECV_STX;
	
		switch (oldRecvState)
		{                           // Receive Command
	
		  case RECV_STX:
			if (c == STX)
			{
			  if (LLfReady)
			  {
				SBUF = DLE;
				LED = OFF;
				Index = 0;
				DataDleReceived = FALSE;
				RecvState = RECV_DATA_DLE_ETX;
	
				while (!TI);
				TI = FALSE;
	
				if (RI)
				{
				  RI = FALSE;
				  if (SBUF == NAK)
				  {
					CALL_isr_T0();
					break;
				  }
				}
				START_T0(T_533_ms);
			  }
			  else
			  {
				CmdReceived = TRUE;
			  }
			}
			else
			{
			  CALL_isr_T0();
			}
			break;
	
		  case RECV_DATA_DLE_ETX:
			if (c == DLE)
			{
			  if (!DataDleReceived)
			  {
				DataDleReceived = TRUE;
				RecvState = RECV_DATA_DLE_ETX;
				START_T0(T_533_ms);
				break;
			  }
			  else
			  {
				DataDleReceived = FALSE;
			  }
			}
			else if (c == ETX)
			{
			  if (DataDleReceived)
			  {
				DataDleReceived = FALSE;
				cmd = SerBuffer[COMMAND];
				len = SerBuffer[LENGTH];
	
				if (cmd >= MINCMDNR && cmd <= MAXCMDNR &&
					len <= MAXDATA && Index == (HEADER + CheckByteCnt + len))
				{
				  if (len == CmdLenTab[cmd - MINCMDNR] ||
					  cmd == 0x4C && len == 18 		   ||
					  cmd == 0x4F && len == 1)
				  {
					if (CheckByteCnt == BCC_CHECKBYTECNT)
					{
					  chk = 0;
	
					  for (i = 0; i < Index; i++)
					  {
						chk ^= SerBuffer[i];
					  }
					}
					else // CRC16
					{
					  Crc = CRC_PRESET;
	
					  for (i = 0; i < Index; i++)
					  {
						Crc = Crc ^((uint)SerBuffer[i] << 8);
	
						for (j = 0; j < 8; j++)
						{
						  if (Crc & 0x8000)
						  {
							Crc = (Crc << 1) ^ CRC_POLYNOM;
						  }
						  else
						  {
							Crc = (Crc << 1);
						  }
						}
					  }
					  chk = (uchar)Crc | (Crc >> 8);
					}
					if (chk == 0)
					{
					  SBUF = DLE;
	
					  SendReady = FALSE;
					  LLfReady = FALSE;
					  CmdValid = !Quit;
					  if (CmdValid)
					  {
						SeqNr = SerBuffer[SEQNR];
	#ifdef AUTODELAY
	
						if (CmdCnt < AUTODELAY_FALLBACK)
						{
						  CmdCnt++;
						}
						else
						{
						  CmdCnt = 0;
						  if (!DelayRateLocked && DelayRate > 0)
						  {
							DelayRateLocked = TRUE;
							DelayRate--;
						  }
						}
	#endif
					  }
					  LED = OFF;
	
					  while (!TI);
					  TI = Quit;
	
					  break;
					}
				  }
				}
				SBUF = NAK;
	
				Quit = FALSE;
				while (!TI);
				TI = FALSE;
	
				break;
			  }
			}
	
			if (Index < SERBUFLEN)
			{
			  SerBuffer[Index++] = c;
			}
			RecvState = RECV_DATA_DLE_ETX;
			START_T0(T_533_ms);
			break;
	
									// Handshake for sending Response
		  case RECV_DLE:
			if (c == DLE)
			{
			  LED = OFF;
			  for (c = 0; c < (HEADER + SerBuffer[LENGTH] + CheckByteCnt); c++)
			  {
				SBUF = SerBuffer[c];
	
				while (!TI);
				TI = FALSE;
	
				if (RI)
				{
				  break;
				}
	
	#ifdef AUTODELAY
				for (i = 0; i < DelayRate; i++)
				{
				  delay_8us_NOP();
				}
	#endif
				if (SerBuffer[c] == DLE)
				{
				  SBUF = DLE;
	
				  while (!TI);
				  TI = FALSE;
				}
			  }
			  if (RI)
			  {
				RI = FALSE;
				if (SBUF == NAK)
				{
				  CALL_isr_T0();
				  break;
				}
			  }
	
	#ifdef AUTODELAY
			  for (i = 0; i < DelayRate; i++)
			  {
				delay_8us_NOP();
			  }
	#endif
			  SBUF = DLE;
	
			  while (!TI);
			  TI = FALSE;
	
			  if (RI)
			  {
				RI = FALSE;
				if (SBUF == NAK)
				{
				  CALL_isr_T0();
				  break;
				}
			  }
	
	#ifdef AUTODELAY
			  for (i = 0; i < DelayRate; i++)
			  {
				delay_8us_NOP();
			  }
	#endif
			  SBUF = ETX;
	
			  while (!TI);
			  TI = FALSE;
	
			  RecvState = RECV_DLE_OR_NAK;
	
			  START_T0(T_533_ms);
			}
			else if (c == STX)
			{
			  CmdReceived = TRUE;
			  CmdValid = FALSE;
			  CALL_isr_UART();
			}
			else
			{
			  CALL_isr_T0();
			}
			break;
	
		  case RECV_DLE_OR_NAK:
			if (c == DLE)
			{
			  RepCnt = 0;
			  Quit = FALSE;
			  SendReady = TRUE;
	
			  LED = ON;
			}
			else if (c == STX)
			{
			  CmdReceived = TRUE;
			  CmdValid = FALSE;
			  CALL_isr_UART();
			}
			else
			{
			  CALL_isr_T0();
			}
			break;
	
		  default:
			CALL_isr_T0();
			break;
	
		}
	  } // end if (RI)
	
	
	  if (TI && !RI)
	  {
		TI = FALSE;
	
	       	LLfReady = TRUE;
	
		if (!CmdReceived)        	// Send Response
		{
		  if (Quit)
		  {
			if (QuitStatus)
			{
			  SerBuffer[SEQNR] = SeqNr;
			}
			SerBuffer[STATUS] = QUIT;
			SerBuffer[LENGTH] = 0;
		  }
	
		  len = HEADER + SerBuffer[LENGTH];
	
		  if (CheckByteCnt == BCC_CHECKBYTECNT)
		  {
			chk = 0;
	
			for (i = 0; i < len; i++)
			{
			  chk ^= SerBuffer[i];
			}
	
			SerBuffer[len] = chk;
		  }
		  else // CRC16
		  {
			Crc = CRC_PRESET;
	
			for (i = 0; i < len; i++)
			{
			  Crc = Crc ^((uint)SerBuffer[i] << 8);
	
			  for (j = 0; j < 8; j++)
			  {
				if (Crc & 0x8000)
				{
				  Crc = (Crc << 1) ^ CRC_POLYNOM;
				}
				else
				{
				  Crc = (Crc << 1);
				}
			  }
			}
			SerBuffer[len]     = (uchar)(Crc >> 8);
			SerBuffer[len + 1] = (uchar) Crc;
		  }
	
		  SBUF = STX;
	
		  RecvState = RECV_DLE;
		}
		else                        // Handshake for receiving Command
		{
		  SBUF = DLE;
	
		  CmdReceived = FALSE;
		  Quit = TRUE;
		  QuitStatus = SerBuffer[STATUS];
		  Index = 0;
		  DataDleReceived = FALSE;
		  RecvState = RECV_DATA_DLE_ETX;
		}
		while (!TI);
		TI = FALSE;
	
		START_T0(T_533_ms);
	
	  } // end if (TI)
	}
	
	
	/***************************************************************************/

⌨️ 快捷键说明

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