📄 rs232.c
字号:
/********************************************************************************************************
*
* 函数名称:
*
* 功能描述: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 + -