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

📄 rs232.c

📁 LPC2103的绝大部分驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************************************
*
* 函数名称:
*
* 功能描述:UART通信程序(中断方式)
*
* 入口参数:无
* 出口参数:无
*
********************************************************************************************************/

#include 	"config.h"
#include	"RTC.h"
#include	"RS232.h"
#include	"PinSet.h"

#define 	rcv_buf_size	40
#define 	KeyIn_size 		10
#define 	IDCheck 		1
#define 	Door_open_close 2
#define 	KeyInHandle 	3
#define 	CLEAR_Key 		0x00
#define 	CLOSE_Key		0x01
#define 	OPEN_Key 		0x10
#define 	ENTER_Key		0x11
#define 	ID_Flag			0xAA
#define		IntervalTime	10

#define		size			256
#define		URAT0_BPS		9600		//波特率
#define		DataBit			8           //发送字长度选择
#define		StopBit			1			//停止位长度选择,1表示长度为1位,2表示长度为2位
#define		CheckBit		0			//0:禁止校验,1:奇校验,2:偈校验,3:强制为1,4:强制为0


unit8		RS232_state;				// 定义RS232数据处理的控制字
unit8		rcv_buf_head = 0;			// 数据缓冲区头指针
unit8		rcv_buf_end = 0;			// 数据缓冲区尾指针
char		rcv_buf[rcv_buf_size];		// UART0数据接收缓冲区




/********************************************************************************************************
*
* 函数名称:IRQ_UART0()
*
* 功能描述:UART0接收中断服务程序
*
* 入口参数:无
* 出口参数:无
*
********************************************************************************************************/

void __irq IRQ_UART0(void)
{	
	char thisChar;
	unit8  const  MESSAGE[]= "Stop\n";
	unit8  const  MESSAGE1[]= "Start\n";

	
	if((U0IIR & 0x0F) == 0x04)			// 接收数据可用
	{
		thisChar = U0RBR;// 读取FIFO的数据,并清楚中断
		if(thisChar == 0x01)
		{
		  IOSET = 0x00010000;
          ISendBuf(MESSAGE1, 6);		// 发送数据
		}
		if(thisChar == 0x02)
		{
	 	  IOCLR = 0x00010000;
          ISendBuf(MESSAGE, 5);		// 发送数据
		}



	}
	
	VICVectAddr = 0x00;			// 中断处理结束
}

/********************************************************************************************************
*
* 函数名称:UART0_Init()
*
* 功能描述:UART初始化,设置工作模式和波特率,中断初始化
*
* 入口参数:baud	波特率
*			set		模式设置(UARTMODE数据结构)
* 出口参数:1为初始化成功,0为初始化失败
*
********************************************************************************************************/
/**/
void UART0_Init()
{	
	unit32	bak;//一个中间变量
	UARTMODE set;//储存发送数据结构的一个数据结构
	unit32 baud = URAT0_BPS;

	//PINSEL0 = (PINSEL0&(~0x0000000F))|0x00000005;		//设置I/O连接到UART0
	PinFuncSelct(PIN_TXD0, PIN_FUNCTION2);     //设置P0.0为第一功能,即UART的TXD0
	PinFuncSelct(PIN_RXD0, PIN_FUNCTION2);		//设置P0.1为第一功能,即UART的RXD0
		
	set.datab	= DataBit;				//串口模式初始化,8位数据长度,2个停止位,禁止产生奇偶校验
	set.stopb	= StopBit;
	set.parity	= CheckBit;
	
	//参数过滤
	if((baud == 0)||(baud > 115200)) return;
	if((set.datab < 5)||(set.datab > 8)) return;
	if((set.stopb == 0)||(set.stopb > 2)) return;
	if(set.parity > 4) return;
	
	//设置串口波特率
	U0LCR = 0x80;						// UOLCR中的DLAB位 = 1,只有DLAB=1,才能对除数锁存寄存器进行操作,除数锁存是波特率发生器的一部分,它保存了用于产生波特率时钟的VPB时钟分频值.
	bak = (Fpclk >> 4)/baud;			//右移四位是表示除以16的意思
	U0DLM = bak>>8;						//获取高字节
	U0DLL = bak & 0xFF;					//获取低字节
	
	//设置串口模式
	bak = set.datab - 5;				// 设置字长
	if(set.stopb == 2) bak|=0x04;		// 判断是否为2位停止位
	
	if(set.parity != 0)
	{	
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U0LCR = bak;						//这里禁止访问输入锁存,这时调试的时候再去读U0DLL,U0DLM,值已经不对,后面再读也不会对
	
	U0FCR = 0x01;						//使能FIFO,并设置触发点为1字节
	U0IER = 0x01;						//允许RBR中断,即接收中断,虽然这时U0DLL,U0DLM已经不对,但这句话完了以后,U0DLL,U0DLM的值还会变,变为0XAA,0X01;

//	IRQEnable();						//使能IRQ中断,在主程序的初始化里,会有这一句的.这里就不需要写了
	
	//使能UART0中断
//	VICIntSelect = 0x00000000;			//设置所有的通道为IRQ中断
	VICVectCntl0 = 0x20 | 0x06;			//UART0分配到IRQ slot0,即最高优先级
	VICVectAddr0 = (unit32)IRQ_UART0;	//设置UART0向量地址
	VICIntEnable = 1 << 0x06;			//使能UART0中断


/*	
	CardReaderDataHandleSt = CardReaderSt_Idle;				//用于刷卡器数据处理。
	CardReadorData.InputType = INPUTDATATYPE_INVALID;		//
*/
	
}

/********************************************************************************************************
*
* 函数名称:Rcv_Buf_Head_Plus()
*
* 功能描述:头指针处理函数
*
* 入口参数:data	缓冲区头指针
* 出口参数:处理后的缓冲区头指针
*
********************************************************************************************************/
/*
int Rcv_Buf_Head_Plus(uint8 data)
{
	if((rcv_buf_head == rcv_buf_size))    //若数据头指针已指到缓冲区尾,则置0,移到缓冲区头
		rcv_buf_head = 0;
	
	else
		rcv_buf_head += data;

	return rcv_buf_head;
}
*/									    
//发送1个字节数据
void UART0_PutChar(unit8 data)
{
	U0THR = data;				
	while((U0LSR&0x40)==0);				//等待数据发送完毕
}


//将缓冲区的数据发送回主机,发送存在buf里的no个数据
void ISendBuf(unit8 const *buf, unit8 no)
{
	unit8  i;
  
	for(i=0; i<no; i++)
		UART0_PutChar(buf[i]);
}
/*
//发送时间
void URAT0_SendDateTime(DATE_TIME DT)
{
	uint8 Send_BUF[19];                   // UART0数据接收缓冲区
	uint8  bak;
	uint16 bak2;
	
	bak2 = DT.Year;
	Send_BUF[0] = bak2/1000+'0';
	Send_BUF[1] = (bak2%1000)/100+'0';		
	Send_BUF[2] = (bak2%100)/10+'0';		
	Send_BUF[3] = (bak2%10)+'0';		
	Send_BUF[4] = '-';
	
	bak = DT.Month;		// 取得月的值,后面加'0'的作用,例如,在个数9,但我们想显示字符9,字符9对应的值并不是9,这时我们把数9加上字符'0'对应的值就是字符9对应的值
	Send_BUF[5] = bak/10+'0';
	Send_BUF[6] = bak%10+'0';		
	Send_BUF[7] = '-';
	
	bak = DT.Day;		// 取得天的值
	Send_BUF[8] = bak/10+'0';
	Send_BUF[9] = bak%10+'0';		
	Send_BUF[10] = ' ';

	bak = DT.Hour;		// 取得时的值
	Send_BUF[11] = bak/10+'0';
	Send_BUF[12] = bak%10+'0';		
	Send_BUF[13] = ':';

	bak = DT.Minit;		// 取得分的值
	Send_BUF[14] = bak/10+'0';
	Send_BUF[15] = bak%10+'0';		
	Send_BUF[16] = ':';

	bak = DT.Second;	// 取得秒的值
	Send_BUF[17] = bak/10+'0';
	Send_BUF[18] = bak%10+'0';		

	DEBUG_PrintBuf(Send_BUF, 19);

}
//把16进制转换成10进制,因为我们在232中就是以16进制发送的
uint8 Change_Hex_To_Dec(char data)
{
	uint8 DecData;

	DecData = data/16*10 + data%16; 

	return DecData;
}

void UART0_SendByte16(char data)			//对一个字节的数据,前四位显示一个数,后四位显示一个数,例11100001打印出来为E1
{
	uint8 buf[4];
	char tem;
	
	tem = data >> 4;
	
	buf[0] = ' ';
	
	if(tem >= 10)
		buf[1] = tem + 'A' - 10;       //即例如要显示15的话就用F显示,以此类推
	else
		buf[1] = tem + '0';				//小于10的话就直接显示,9,8.....
		
	if((data & 0x0F) >= 10)
		buf[2] = (data & 0x0F) + 'A' - 10;
	else
		buf[2] = (data & 0x0F) + '0';
		
	ISendBuf(buf,3);
}
*/
/************************UART0与SPI通信******************************/

/*UART0从FLASH读数据*/
/*
void UTAR_SPI_Read(void)
{
	uint8	i;
	uint8	ReadChipNum;
	uint16	ReadBeginByte;
	uint16	ReadLength;
	uint32	ReadBeginPage;
	char	ReadData[256];
	uint8 	buf[3];

#ifdef use_debugPrint
	uint8 Message1[] = "ReadChipNum is: ";
	uint8 Message2[] = "ReadBeginPage is: ";
	uint8 Message3[] = "ReadBeginByte is: ";
	uint8 Message4[] = "ReadLength is: ";
#endif

	uint8 data;

	if(rcv_buf[rcv_buf_head] == SPI_READ)		//写FLASH
	{
		Rcv_Buf_Head_Plus(1);

		ReadChipNum = rcv_buf[rcv_buf_head];

		data = ReadChipNum >> 4;
		
		if(data >= 10)
			buf[0] = data + 'A' - 10;
		else
			buf[0] = data + '0';
			
		if((ReadChipNum & 0x0F) >= 10)
			buf[1] = (ReadChipNum & 0x0F) + 'A' - 10;
		else
			buf[1] = (ReadChipNum & 0x0F) + '0';
			
		buf[2] = '\n';

		Rcv_Buf_Head_Plus(1);
		DEBUG_PrintBuf(Message1,16);
		DEBUG_PrintBuf(buf,3);

		ReadBeginPage = rcv_buf[rcv_buf_head];
		
		data = ReadBeginPage >> 4;
		
		if(data >= 10)
			buf[0] = data + 'A' - 10;
		else
			buf[0] = data + '0';
			
		if((ReadBeginPage & 0x0F) >= 10)
			buf[1] = (ReadBeginPage & 0x0F) + 'A' - 10;
		else
			buf[1] = (ReadBeginPage & 0x0F) + '0';
			
		buf[2] = '\n';
		
		Rcv_Buf_Head_Plus(1);
		DEBUG_PrintBuf(Message2,18);
		DEBUG_PrintBuf(buf,3);

		ReadBeginByte = rcv_buf[rcv_buf_head];
		
		data = ReadBeginByte >> 4;

		if(data >= 10)
			buf[0] = data + 'A' - 10;
		else
			buf[0] = data + '0';
			
		if((ReadBeginByte & 0x0F) >= 10)
			buf[1] = (ReadBeginByte & 0x0F) + 'A' - 10;
		else
			buf[1] = (ReadBeginByte & 0x0F) + '0';
			
		buf[2] = '\n';

		Rcv_Buf_Head_Plus(1);
		DEBUG_PrintBuf(Message3,18);
		DEBUG_PrintBuf(buf,3);

		ReadLength = rcv_buf[rcv_buf_head];

		data = ReadLength >> 4;
		
		if(data >= 10)
			buf[0] = data + 'A' - 10;
		else
			buf[0] = data + '0';
			
		if((ReadLength & 0x0F) >= 10)
			buf[1] = (ReadLength & 0x0F) + 'A' - 10;
		else
			buf[1] = (ReadLength & 0x0F) + '0';

		buf[2] = '\n';

		Rcv_Buf_Head_Plus(1);
		DEBUG_PrintBuf(Message4,15);
		DEBUG_PrintBuf(buf,3);

		Read_Flash_Data(ReadChipNum,ReadBeginPage,ReadBeginByte,ReadLength,ReadData);
		
		for(i = 0; i<ReadLength; i++)
		{
			data = ReadData[i] >> 4;
			
			if(data >= 10)
				buf[0] = data + 'A' - 10;
			else

⌨️ 快捷键说明

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