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

📄 serial.c

📁 LCD及键盘、RS232通信控制源代码、采用keil c51环境编译
💻 C
📖 第 1 页 / 共 2 页
字号:
						{
							ucTmp += *ip_Tmp - 'A' +10;
						}
						else
						{
							ucTmp += *ip_Tmp - '0';
						}
						if( ucTmp != ucRcvCheckSum)
						{//校验错误
#ifdef NDS_UI_DEBUG
#ifdef NDS_UI_DEBUG_ENABLEDIS
							SetCursorPos(22);
							DisplayChar( ((ucTmp)>>4)+0x30 );
							DisplayChar( ((ucTmp)&0x0f)+0x30 );
							DisplayChar( ((ucRcvCheckSum)>>4)+0x30 );
							DisplayChar( ((ucRcvCheckSum)&0x0f)+0x30 );
#endif
#endif
							break;
						}
/*						while( 1 )
						//deleted by XuYiBo,2002-Oct-18(没必要把所有的检测参数都送到LinkLayer)
						{
*/
							UISemaphore.ucExamAreaSem = 0x00;				//request semaphore
							if( UISemaphore.ucExamAreaSem == 0x00)
							{
								if(++UARTRcvFrame == UART_RcvBuffer+UARTBUFFERLEN_RX)
								{
									UARTRcvFrame = UART_RcvBuffer;
								}
								if(ConnectFlag == TRUE)
								{
									UIDataArea.Exam_Buffer.ConnectFlag		= TRUE;
								}
								else
								{
									UIDataArea.Exam_Buffer.ConnectFlag		= FALSE;
								}
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.Current[0]		= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.Current[1]		= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.ExciterLevel[0]	= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.ExciterLevel[1]	= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.TravelPow		= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.ReflectPow		= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.AmpTemp			= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.RxTemp			= ucTmp;
								UARTRcvFrame = AscToHex(UARTRcvFrame,&ucTmp);
								UIDataArea.Exam_Buffer.TxTemp			= ucTmp;

								UIDataArea.Exam_Buffer.RXIF_LOCK		= (*UARTRcvFrame)&0xf;
								if(++UARTRcvFrame == UART_RcvBuffer+UARTBUFFERLEN_RX)
								{
									UARTRcvFrame = UART_RcvBuffer;
								}
								UIDataArea.Exam_Buffer.RXRF_LOCK		= (*UARTRcvFrame)&0xf;
								if(++UARTRcvFrame == UART_RcvBuffer+UARTBUFFERLEN_RX)
								{
									UARTRcvFrame = UART_RcvBuffer;
								}
								UIDataArea.Exam_Buffer.TXIF_LOCK		= (*UARTRcvFrame)&0xf;
								if(++UARTRcvFrame == UART_RcvBuffer+UARTBUFFERLEN_RX)
								{
									UARTRcvFrame = UART_RcvBuffer;
								}
								UIDataArea.Exam_Buffer.TXRF_LOCK		= (*UARTRcvFrame)&0xf;

								UIDataArea.Exam_Buffer.ExamDirtyFlag	= 1;

								UISemaphore.ucExamAreaSem = 0xff;			//release semaphore
//								break;	//deleted by XuYiBo,2002-Oct-18(没必要把所有的检测参数都送到LinkLayer)
							}
/*			deleted by XuYiBo,2002-Oct-18(没必要把所有的检测参数都送到LinkLayer)
							UISemaphore.ucExamAreaSem = 0xff;				//release semaphore
							DelayCycle(16);
						}
*/
						break;
					default:
#ifdef NDS_UI_DEBUG
#ifdef NDS_UI_DEBUG_ENABLEDIS
						SetCursorPos(2);
						DisplayChar( ((*UARTRcvFrame)>>4)+0x30 );
						DisplayChar( ((*UARTRcvFrame)&0x0f)+0x30 );
#endif
#endif
						break;
					}
					break;

				case ACK_FRAME:
					if(ucRcvLen == ACK_FRAME_LEN)
					{//Length OK
						ET2 = 0;			//disable timer2
						ucAckTimeout= 0;
						EnableTran	= TRUE;
						ConnectFlag	= TRUE;
						ucNoAckCount= 0;
						ET2 = 1;			//enable timer2
					}
					break;
				case NAK_FRAME:
					if(ucRcvLen == NAK_FRAME_LEN)
					{//Length OK
						ET2 = 0;			//disable timer2
						ucAckTimeout = 0;
						EnableTran = TRUE;
						if( ++ucNoAckCount < MAX_REP)
						{
							UARTTransHead = UARTTransFrame;
							StopTran	= FALSE;
							TI = 1;
						}
						else
						{//重发次数超过“最大允许重发次数”
							ucTmp = 255;
							while( --ucTmp )
							{
								UISemaphore.ucExamAreaSem = 0x00;				//request semaphore
								if( UISemaphore.ucExamAreaSem == 0x00)
								{
									UIDataArea.Exam_Buffer.ConnectFlag		= FALSE;
									UIDataArea.Exam_Buffer.ExamDirtyFlag	= 1;
									UISemaphore.ucExamAreaSem = 0xff;			//release semaphore
									break;
								}
								UISemaphore.ucExamAreaSem = 0xff;				//release semaphore
								DelayCycle(16);
							}
							UISemaphore.ucExamAreaSem = 0xff;					//release semaphore

							ConnectFlag	= FALSE;
							UARTTransFrame	= UARTTransHead;
							ucNoAckCount	= 0;
							if(UARTTransHead != UARTTransTail)
							{
								StopTran = FALSE;
								TI = 1;
							}
						}
						ET2 = 1;			//enable timer2
					}
					break;
				case REQ_FRAME:
					if(ucRcvLen == REQ_FRAME_LEN)
					{//Length OK
						WriteSerial(ucACK,ACK_FRAME_LEN);	//应答ACK
						break;
					}
					break;
				default:
#ifdef NDS_UI_DEBUG
#ifdef NDS_UI_DEBUG_ENABLEDIS
					SetCursorPos(0);
					DisplayChar( ((*UARTRcvFrame)>>4)+0x30 );
					DisplayChar( ((*UARTRcvFrame)&0x0f)+0x30 );
#endif
#endif
					break;
				}//switch(*UARTRcvFrame)

////////////////////////////////////////////////
			}//if( ucTmp == ETX)
		}//if( ucTmp != STX)
	}//if( UARTRcvHead != UARTRcvTail)
}


/******************************************************************************
*                                                                             *
*	将指定的ASCII转换成HEX                                                    *
*                                                                             *
******************************************************************************/
unsigned char idata * AscToHex(unsigned char idata *Ptr_Uart,unsigned char data *ucHex)
{
	*ucHex = *Ptr_Uart;
	if( *ucHex >= 'a' )
	{
		*ucHex = *ucHex - 'a' +10;
	}
	else if( *ucHex >= 'A' )
	{
		*ucHex = *ucHex - 'A' +10;
	}
	else
	{
		*ucHex &= 0x0f;
	}
	*ucHex <<= 4;
	if(++Ptr_Uart == UART_RcvBuffer+UARTBUFFERLEN_RX)
	{
		Ptr_Uart = UART_RcvBuffer;
	}
	if( *Ptr_Uart >= 'a' )
	{
		*ucHex += *Ptr_Uart - 'a' +10;
	}
	else if( *Ptr_Uart >= 'A' )
	{
		*ucHex += *Ptr_Uart - 'A' +10;
	}
	else
	{
		*ucHex += *Ptr_Uart - '0';
	}
	if(++Ptr_Uart == UART_RcvBuffer+UARTBUFFERLEN_RX)
	{
		Ptr_Uart = UART_RcvBuffer;
	}
	return Ptr_Uart;
}

/******************************************************************************
*                                                                             *
*	从双口ram取出系统参数,转换成命令串并放入发送缓冲区                       *
*                                                                             *
******************************************************************************/

void GetSysPara(void)
{
unsigned char ucCRC,ucTmp;

	if(UIDataArea.SysPara.ucSysparaDirtyFlag & UpFreq_UP)
	{//UpLink frequency has been chang
		WriteSerial(ucUpfreq,3);
		ucCRC = ucUpfreq[0]^ucUpfreq[1]^ucUpfreq[2];

		ucTmp = UIDataArea.SysPara.ucUpFreq[0]>>4;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);
		ucTmp = UIDataArea.SysPara.ucUpFreq[0]&0x0f;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);

		ucTmp = UIDataArea.SysPara.ucUpFreq[1]>>4;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);
		ucTmp = UIDataArea.SysPara.ucUpFreq[1]&0x0f;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);

		ucTmp = ucCRC>>4;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		WriteSerialByte(ucTmp);
		ucTmp = ucCRC&0x0f;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		WriteSerialByte(ucTmp);
		WriteSerialByte(ETX);
	}
	if(UIDataArea.SysPara.ucSysparaDirtyFlag & DwnFreq_UP)
	{//DownLink frequency has been chang
		WriteSerial(ucDwnfreq,3);
		ucCRC = ucDwnfreq[0]^ucDwnfreq[1]^ucDwnfreq[2];

		ucTmp = UIDataArea.SysPara.ucDownFreq[0]>>4;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);
		ucTmp = UIDataArea.SysPara.ucDownFreq[0]&0x0f;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);

		ucTmp = UIDataArea.SysPara.ucDownFreq[1]>>4;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);
		ucTmp = UIDataArea.SysPara.ucDownFreq[1]&0x0f;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		ucCRC ^= ucTmp;
		WriteSerialByte(ucTmp);

		ucTmp = ucCRC>>4;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		WriteSerialByte(ucTmp);
		ucTmp = ucCRC&0x0f;
		if(ucTmp>9)
		{
			ucTmp += 'A' - 10;
		}
		else
		{
			ucTmp += '0';
		}
		WriteSerialByte(ucTmp);
		WriteSerialByte(ETX);
	}
}

⌨️ 快捷键说明

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