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

📄 uart.c

📁 AVR单片机C语言程序设计实例精粹
💻 C
📖 第 1 页 / 共 2 页
字号:
// Output      : none
// Description : C1
//********************************************************************
void C1Command(void)
{
	static INT8U bCount = 0;
	bCount++;
}

//********************************************************************
// Function    : C2Command
// Input       : none
// Output      : none
// Description : C2,MM
//********************************************************************
void C2Command(void)
{
}

//********************************************************************
// Function    : D1Command
// Input       : none
// Output      : none
// Description : D1
//********************************************************************
void D1Command(void)
{
	SciBuffer_Tx_In(&stSciBuffer,'I');
	SciBuffer_Tx_In(&stSciBuffer,' ');
	SciBuffer_Tx_In(&stSciBuffer,'L');
	SciBuffer_Tx_In(&stSciBuffer,'O');
	SciBuffer_Tx_In(&stSciBuffer,'V');
	SciBuffer_Tx_In(&stSciBuffer,'E');
	SciBuffer_Tx_In(&stSciBuffer,' ');
	SciBuffer_Tx_In(&stSciBuffer,'Y');
	SciBuffer_Tx_In(&stSciBuffer,'O');
	SciBuffer_Tx_In(&stSciBuffer,'U');
	SciBuffer_Tx_In(&stSciBuffer,' ');
	SciBuffer_Tx_In(&stSciBuffer,'!');
	SciBuffer_Tx_In(&stSciBuffer,'\n');
	
	UART_WRITE_DATA(&stSciBuffer);
}

//********************************************************************
// Function    : D2Command
// Input       : none
// Output      : none
// Description : D2
//********************************************************************
extern INT16S wLineVoltRMS;
extern INT16S wLineVoltReal;
extern INT16S wLineVoltSample;
extern INT16U wLinePeriod;
extern INT16U wLinePeriodTemp;
extern INT16U wLineCaptureTime;
extern INT16U wLineCaptureTimeLast;

void D2Command(void)
{
	//INT32U dwTest = 0xFFFFFFFF; //4294967295
	sDataToNumber(wLineVoltSample,5,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,' ');
	
	sDataToNumber(wLineVoltReal,5,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,' ');
	
	sDataToNumber(wLineVoltRMS,5,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,' ');
	
	sDataToNumber(wLineCaptureTime,5,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,'\n');

	UART_WRITE_DATA(&stSciBuffer);
}

//********************************************************************
// Function    : D3Command
// Input       : none
// Output      : none
// Description : D3
//********************************************************************
void D3Command(void)
{
	INT32U dwTest = 0x12345678;
	
	sDataToChar(dwTest,8,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,' ');
	
	sDataToChar(dwTest,4,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,' ');
	
	sDataToChar(dwTest,2,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,' ');
	
	sDataToChar(dwTest,1,&stSciBuffer);
	SciBuffer_Tx_In(&stSciBuffer,'\n');
	
	UART_WRITE_DATA(&stSciBuffer);
}

//********************************************************************
// Function    : XXCommand
// Input       : none
// Output      : none
// Description : XX
//********************************************************************
void XXCommand(void)
{
	sStringToChar("Received XX Command.\n",&stSciBuffer);
	UART_WRITE_DATA(&stSciBuffer);	
}

//********************************************************************
// Function    : YYCommand
// Input       : none
// Output      : none
// Description : YY,MM
//********************************************************************
void YYCommand(void)
{
	INT8U bChar[3];
	bChar[0] = stSciBuffer.bRxBuffer[2];
	bChar[1] = stSciBuffer.bRxBuffer[3];
	bChar[2] = stSciBuffer.bRxBuffer[4];
	sStringToChar("Received YY Command , ",&stSciBuffer);
	if((bChar[0] == ',') && \
	   (bChar[1] >= '0') && (bChar[1] <= '9') &&\
	   (bChar[2] >= '0') && (bChar[2] <= '9'))
	{
		sStringToChar("Parameter : ",&stSciBuffer);
		SciBuffer_Tx_In(&stSciBuffer,bChar[1]);
		SciBuffer_Tx_In(&stSciBuffer,bChar[2]);
		SciBuffer_Tx_In(&stSciBuffer,'\n');
	}
	else
	{
		sStringToChar("Illegal Parameter !\n",&stSciBuffer);
	}	
	UART_WRITE_DATA(&stSciBuffer);
}

//********************************************************************
// Function    : ZZCommand
// Input       : none
// Output      : none
// Description : ZZ,MMM,NNN
//********************************************************************
void ZZCommand(void)
{
	INT8U bChar[8];
	bChar[0] = stSciBuffer.bRxBuffer[2];
	bChar[1] = stSciBuffer.bRxBuffer[3];
	bChar[2] = stSciBuffer.bRxBuffer[4];
	bChar[3] = stSciBuffer.bRxBuffer[5];
	bChar[4] = stSciBuffer.bRxBuffer[6];
	bChar[5] = stSciBuffer.bRxBuffer[7];
	bChar[6] = stSciBuffer.bRxBuffer[8];
	bChar[7] = stSciBuffer.bRxBuffer[9];
	sStringToChar("Received ZZ Command , ",&stSciBuffer);
	if((bChar[0] == ',') && (bChar[4] == ',') && \
	   (bChar[1] >= '0') && (bChar[1] <= '9') && \
	   (bChar[2] >= '0') && (bChar[2] <= '9') && \
	   (bChar[3] >= '0') && (bChar[3] <= '9') && \
	   (bChar[5] >= '0') && (bChar[5] <= '9') && \
	   (bChar[6] >= '0') && (bChar[6] <= '9') && \
	   (bChar[7] >= '0') && (bChar[7] <= '9'))
	{
		sStringToChar("Parameter1 : ",&stSciBuffer);
		SciBuffer_Tx_In(&stSciBuffer,bChar[1]);
		SciBuffer_Tx_In(&stSciBuffer,bChar[2]);
		SciBuffer_Tx_In(&stSciBuffer,bChar[3]);
		SciBuffer_Tx_In(&stSciBuffer,' ');	
		sStringToChar("Parameter2 : ",&stSciBuffer);
		SciBuffer_Tx_In(&stSciBuffer,bChar[5]);
		SciBuffer_Tx_In(&stSciBuffer,bChar[6]);
		SciBuffer_Tx_In(&stSciBuffer,bChar[7]);
		SciBuffer_Tx_In(&stSciBuffer,'\n');	
	}
	else
	{
		sStringToChar("Illegal Parameters !\n",&stSciBuffer);
	}
	UART_WRITE_DATA(&stSciBuffer);
}

typedef void (*pFunc)(void);

pFunc CommandJobArray[8]=
{
	C1Command,C2Command,D1Command,D2Command,
	D3Command,XXCommand,YYCommand,ZZCommand
};

char wCommandTabArray[8][2]=
{
	"C1",     "C2",
	"D1",	  "D2",		"D3",
	"XX",     "YY",     "ZZ",
};

//********************************************************************
// Function    : SCI_Parsing
// Input       : ptr-Pointer to SCI Buffer
// Output      : none
// Description : Parse Received String and Execute Command
//********************************************************************
void SCI_Parsing(struct SCI_Buffer *ptr)
{
	INT8S wLow;
	INT8S wHigh;
	INT8S wMid;
	char wCommandBuffer[2];
	wCommandBuffer[0] = ptr->bRxBuffer[0];
	wCommandBuffer[1] = ptr->bRxBuffer[1];
	
	wLow = 0;
	wHigh = 8 - 1;
	wMid = wHigh >> 1;
		
	while(wLow <= wHigh && strncmp(wCommandTabArray[wMid],wCommandBuffer,2)!=0)
	{
		if(strncmp(wCommandTabArray[wMid],wCommandBuffer,2) > 0)
		{
			wHigh = wMid - 1;	
		}
		else
		{
			wLow = wMid + 1;
		}
			
		wMid = (wLow + wHigh) >> 1;
	}
		
	if(strncmp(wCommandTabArray[wMid],wCommandBuffer,2)==0)
	{
		CommandJobArray[wMid]();
	}
}

//********************************************************************
// Function    : sbNumAsciiPick
// Input       : dwData -Input Data,bPosition-Selected Index
// Output      : Position Index in Decimal System
// Description : Extract out Selected Number in Decimal System
//********************************************************************
INT8U sbNumAsciiPick(INT32U dwData,INT8U bPosition)
{
	INT8U	bCode;
	switch(bPosition)
	{
		case 1:
			bCode = dwData % 10 + '0';
			break;
		case 2:
			bCode = (dwData / 10) % 10 + '0';
			break;
		case 3:
			bCode = (dwData / 100) % 10 + '0';
			break;
		case 4:
			bCode = (dwData / 1000) % 10 + '0';
			break;
		case 5:
			bCode = (dwData / 10000) % 10 + '0';
			break;
		case 6 :
			bCode = (dwData / 100000) % 10 + '0';
			break;
		case 7 :
			bCode = (dwData / 1000000) % 10 + '0';
			break;
		case 8 :
			bCode = (dwData / 10000000) % 10 + '0';
			break;
		case 9 :
			bCode = (dwData / 100000000) % 10 + '0';
			break;
		case 10 :
			bCode = (dwData / 1000000000) % 10 + '0';
			break;
		default:
			bCode = '0';
			break;
	}	
	return(bCode);
}

//********************************************************************
// Function    : sbCharAsciiPick
// Input       : dwData -Input Data,bPosition-Selected Index
// Output      : Position Index in HEX System
// Description : Extract out Selected Char in HEX System
//********************************************************************
INT8U sbCharAsciiPick(INT32U dwData,INT8U bPosition)
{
	INT8U bCode;
	bCode = (dwData >> ((bPosition - 1) << 2)) & 0x0000000F;
	if(bCode > 9)
	{
		bCode = bCode + 'A' - 0x0A;
	}
	else
	{
		bCode = bCode + '0';
	}
	return(bCode);
}
	 
//********************************************************************
// Function    : sDataToNumber
// Input       : dwData -Input Data,bIndex - Length 
//               ptr-Pointer to SCI Buffer
// Output      : none
// Description : Convert Data to Decimal Number
//********************************************************************
void sDataToNumber(INT32U dwData,INT8U bIndex,struct SCI_Buffer *ptr)
{
	while(bIndex != 0)
	{
		SciBuffer_Tx_In(ptr,sbNumAsciiPick(dwData,bIndex--));
	}
}

//********************************************************************
// Function    : sDataToChar
// Input       : dwData -Input Data,bIndex - Length 
//               ptr-Pointer to SCI Buffer
// Output      : none
// Description : Convert Data to HEX Number
//********************************************************************
void sDataToChar(INT32U dwData,INT8U bIndex,struct SCI_Buffer *ptr)
{
	if((bIndex >= 1) && (bIndex <= 8))
	{
		while(bIndex != 0)
		{
			SciBuffer_Tx_In(ptr,sbCharAsciiPick(dwData,bIndex--));
		}
	}
}

//********************************************************************
// Function    : sStringToChar
// Input       : string - pointer to char list
//               ptr-Pointer to SCI Buffer
// Output      : none
// Description : Convert String to Char
//********************************************************************
void sStringToChar(INT8U *string,struct SCI_Buffer *ptr)
{
	while(*string != '\0')
	{
		SciBuffer_Tx_In(ptr,*string++);
	}
}


//=========================END OF FILE=========================//

⌨️ 快捷键说明

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