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

📄 serial.c

📁 ADUC的周立功7290可以显示的程序
💻 C
字号:
/*----------------------------------------------------------------------------
名  称:serial.c
功  能:aduc848串口相关函数的实现
版  本:0.1
负责人:邓健
历  史:
       2007.7.11 created by Jiandeng
----------------------------------------------------------------------------*/
#include<aduc845.h>

#define RX_IDL	0
#define RX_HDR	1
#define RX_ADD	2
#define RX_CMD	3
#define RX_LEN	4
#define RX_DAT	5
#define RX_CHK	6
#define RX_X16	7
#define RX_END	255
unsigned char xdata serialRxData[20];
unsigned char xdata serialTxData[2500];
unsigned int  serialTxLEN;
unsigned char serialRxADD,serialRxCMD,serialRxLEN;
unsigned char serialRxStatus = RX_IDL;
extern unsigned char ADDR;
/**********************************************************
串口初始化,波特率设置为115200,使能中断
***********************************************************/
void SerialInit(void)
{
	T3CON = 0x82;	//115200 Baud rate
	T3FD = 0x2D;
	SCON = 0x52; 
	ES=1;			//Enable interrupt
}
/**********************************************************
串口发送,把发送缓冲区里的数据通过串口发送出去
***********************************************************/
void SerialTx(unsigned int len)
{
	serialTxLEN = len;
	SBUF = 0xFE;	
}

/**********************************************************
串口发送
【add】	从机地址
【cmd】 命令 
【len】 数据长度
    	待发送的数据保存在serialTxData[10]开始先
***********************************************************/
void SerialSend(unsigned char add,unsigned char cmd,unsigned int len)
{
	unsigned char serialTxCHK = 0;
	unsigned int i;

	serialTxData[0] = 0xFE;
	serialTxData[1] = 0x68;
	serialTxData[2] = add;
	serialTxData[3] = add;
	serialTxData[4] = cmd;
	serialTxData[5] = cmd;
	serialTxData[6] = len>>8;
	serialTxData[7] = len;
	serialTxData[8] = len>>8;
	serialTxData[9] = len;

	for(i = 10;i < 10 + len;i ++)			//checksum
	{
		serialTxCHK += serialTxData[i];
	}

	serialTxData[10 + len] = serialTxCHK;
	serialTxData[11 + len] = 0x16;
	SerialTx(12 + len);
}

/**********************************************************
串口中断函数
***********************************************************/
void int_serial() interrupt 4
{
	static unsigned char serialRxCounter,serialRxCHK;
	static unsigned int serialTxCounter;
	if(1 == RI)
	{
		RI = 0;			
		switch(serialRxStatus)
		{					   
			case RX_IDL:										//空闲状态,接收0xFE进入HDR状态	  
				if(SBUF == 0xFE)
				{
					serialRxStatus = RX_HDR;break;				 	 
				}												//HDR状态,接收0x68开始接收地址,接收到0xFE则保持HDR状态
			case RX_HDR:
				if(SBUF == 0x68)
				{
					serialRxStatus = RX_ADD;
				}
				else if(SBUF != 0xFE)
				{
					serialRxStatus = RX_IDL;						
				}
				break;							
			case RX_ADD:										//ADD状态,接收1B的地址,重复发送两次,接收成功则进入CMD状态
				if(serialRxCounter == 0)
				{
					serialRxADD = SBUF;
					serialRxCounter = 1;
				}
				else
				{	
					serialRxCounter = 0;
					if(SBUF == serialRxADD && serialRxADD == ADDR)
					{
						serialRxStatus = RX_CMD;  							
					}
					else
					{
						serialRxStatus = RX_IDL;
					}
				}
				break;
			case RX_CMD:										//CMD状态,1B命令,重复发送两次,接收成功则进入LEN状态
				if(serialRxCounter == 0)
				{
					serialRxCMD = SBUF;
					serialRxCounter = 1;
					}
				else
				{	
					serialRxCounter = 0;
					if(SBUF == serialRxCMD)
					{
						serialRxStatus = RX_LEN;							
					}
					else
					{
						serialRxStatus = RX_IDL;
					}
				}
				break;
			case RX_LEN:				 						//LEN状态,接收2B数据长度,重复两次,这里只考虑了低字节,接收成功进入DAT或者CHK状态
				if(serialRxCounter == 0)
				{
					serialRxCounter = 1;
				}
				else if(serialRxCounter == 1)
				{
					serialRxLEN = SBUF;
					serialRxCounter = 2;
				}
				else if(serialRxCounter == 2)
				{
					serialRxCounter = 3;
				}
				else
				{	
					serialRxCounter = 0;
					if(SBUF == serialRxLEN)
					{	
						serialRxCHK = 0;  						
						if(serialRxLEN == 0)
						{
							serialRxStatus = RX_CHK;
						}
						else
						{	
							serialRxStatus = RX_DAT;
						}							
					}
					else
					{
						serialRxStatus = RX_IDL;	
					}
				}
				break;
			case RX_DAT:										//DAT状态,接收数据,接收完了进入CHK状态
				if(serialRxCounter < serialRxLEN)
				{
					serialRxData[serialRxCounter++] = SBUF;serialRxCHK += SBUF;			  
				}
				if(serialRxCounter == serialRxLEN)
				{
					serialRxCounter = 0;
					serialRxStatus = RX_CHK;
				}
				break;
			case RX_CHK:			   							//CHK状态,接收校验和
				if(SBUF == serialRxCHK)
				{
					serialRxStatus = RX_X16;
				}
				else
				{
					serialRxStatus = RX_IDL;
				}
				break;
			case RX_X16:			   							//X16状态,接收结束标志0x16 ,接收成功进入END状态
				if(SBUF == 0x16)
				{
					serialRxStatus = RX_END;
				}
				else
				{
					serialRxStatus = RX_IDL;
				}
				break;
			case RX_END:
				break;
			default:
				serialRxStatus = RX_IDL;break;
		}
	}
	if(1 == TI)
	{
		TI=0;
		if(serialTxCounter < serialTxLEN)
		{		
			SBUF=serialTxData[serialTxCounter++];
		} 
		if(serialTxCounter == serialTxLEN)
		{
			serialTxLEN = 0;
			serialTxCounter = 0;			
		}
	} 	
}

⌨️ 快捷键说明

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