📄 uart0.#1
字号:
//*********************************************************
// 项 目: 通用控制器-V1.0
// 文件名: Uart0.C
// 描 述: 串口0中断服务程序
//*********************************************************
//===============================================
#include "main.h" //全部头文件
#include "Uart0.h"
#include "MFRC522.h"
//===============================================
//***********************************************
//变量定义
//***********************************************
UCHAR bdata BitFlag1; //位寻址变量sbit NewPack = BitFlag1^0; //串口新数据包标志sbit Head_flag = BitFlag1^1; //串口包头标志
UCHAR bdata DataFormat; //读卡器数据输出格式
sbit ReqMode = BitFlag1^0; //寻卡方式:0-非休眠卡,1-所有卡
sbit keySelect = BitFlag1^0; //密钥选择:0=KeyA,1=KeyB
sbit OutFomart = BitFlag1^0; //输出格式:1=读系列号,0=读数据块/
sbit ReadMode = BitFlag1^0; //读卡方式:0=块,1=字节
sbit AutoSend = BitFlag1^0; //自动发送:0=被动,1=自动
extern UCHAR xdata rx_buf[TX_PLOAD_WIDTH]; //
extern UCHAR xdata tx_buf[TX_PLOAD_WIDTH];
extern UCHAR data SetxxBuf [4];
UCHAR data CardId; //读卡器地址
UCHAR data SioBurd; //读卡器波特率
UCHAR data CardCs1; //读卡器参数1
UCHAR data Sio_Lth;
UCHAR idata Pack_len; //数据长度
UCHAR idata ComTBufHead, ComTBufTail;
UCHAR idata ComRBufHead, ComRBufTail;
UCHAR xdata ComTBuf[Com0TBuf_len] _at_ Com0TBuf_addr; //00H
UCHAR xdata ComRBuf[Com0RBuf_len] _at_ Com0RBuf_addr; //40H
//***********************************************
//函数开始
//===============================================
//初始化UART0
//===============================================
void Init_Com0(void) //初始化串口0
{
ClearComRBuf(); //清发送、接收缓冲区
OpenCom0(); //设置串口0
}
//-----------------------------------------------
//清发送、接收缓冲区
//-----------------------------------------------
void ClearComRBuf(void) //
{
unsigned char i;
ComRBufHead=ComRBufTail=0;
ComTBufHead=ComTBufTail=0;
for (i=0;i<Com0TBuf_len;i++)
{ ComTBuf[i]=0; } //清发送缓冲区
for (i=0;i<Com0RBuf_len;i++)
{ ComRBuf[i]=0; } //清接收缓冲区
}
/***********************************************
//打开UART0
/***********************************************/
void OpenCom0(void)
{ //CKCON=T3H,T3L,T2H,T2L,T1,T0,SCA1,SCA0
CKCON &= 0xF7; //T1M=0,T1CLK=SYSCLK/12
TMOD = 0x21; //T1 方式2,重加载
TH1 = TBUAD; //MAIN.H定义:256-SYSCLK/12/BUAD=106
TR1 =1; //S0MD,-,MCE0,REN0,TB80,RB80,TI0,RI0
SCON0 = 0x30; // 0 0 1 1 0 0 0 0
ComTBufHead=ComTBufTail=0; //置发送缓冲头、尾指针=0
ComRBufHead=ComRBufTail=0; //置接收缓冲头、尾指针=0
ES0=1; //容许串口0中断
}
/***********************************************
//UART0中断处理程序
//接收数据包格式:STX,长度,目地,源地,类型,命令.....ETX
// AA 10 25 81 01 XX BB
/***********************************************/
void CommISR(void) interrupt 4
{
if (RI0==1)
{ RS232_Rev(); }
//串口发送中断处理
if (TI0==1)
{ RS232_Send();}
}
/***********************************************
//串口接收中断处理
/***********************************************/
void RS232_Rev(void)
{
unsigned char tmp;
RI0=0; //接收数据
tmp = SBUF0;
ComRBuf[ComRBufTail]=tmp;
ComRBufTail++; //存储指针+1
if (Head_flag == FALSE)
{
ComRBufTail = 0;
if (tmp==0xAA)
{
ComRBufTail=1; //发现AA包头,指针=01
Head_flag=TRUE; //置包头标志
}
return;
}
if (ComRBufTail == 2 && tmp != CardId)
{ //地址不符合,禁止接收
ComRBufTail = 0;
Head_flag = FALSE; //清包头标志
return;
}
//AA包头,地址符合
if (ComRBufTail>=Com0RBuf_len)
{ //包长异常
NewPack=0;
Head_flag=0;
ComRBufTail=0; //重新开始
return;
}
if (tmp==0xBB && ComRBufTail==ComRBuf[2]+5) //判包尾标志BB,
{ //已收包尾,且包长>6
Pack_len=ComRBufTail; //数据包长度
ComRBufTail=0;
Head_flag=0;
NewPack=1;
Pack_Exec(); //数据包解析
}
}
/***********************************************
//串口发送中断处理
/***********************************************/
void RS232_Send(void)
{
TI0=0; //清发送中断
if (ComTBufHead==Com0TBuf_len)
{
ComTBufHead=0; //到最大长度指针归零
}
if (ComTBufHead<Sio_Lth) //
{
SBUF0=ComTBuf[ComTBufHead]; //未完发送下字节
ComTBufHead++;
}
else RW485 = 0;
}
/***********************************************
//接收数据包解析:
/***********************************************/
void Pack_Exec(void)
{
unsigned char i,ptype,pcom;
if (NewPack)
{
pcom = ComRBuf[3]; //包命令
switch (pcom)
{
case 0x80: //设置ID
Card_Setxx();
break;
//-------------------
case 0x81: //设置波特率
break;
//-------------------
case 0x8E: //设置读卡器输出方式
break;
//-------------------
case 0x21: //输出到P1口
break;
//-------------------
case 0x22: //
i=3;
break;
//-------------------
default:
i=0xff; //
break;
}
NewPack = 0;
}
}
/***********************************************
//上位机设置读卡器波特率
/***********************************************/
void Card_Setxx(void)
{
unsigned char i;
i = 1;
SetxxBuf[0] = ComRBuf[4];
SetxxBuf[1] = ComRBuf[5];
SetxxBuf[2] = ComRBuf[6];
SetxxBuf[3] = ComRBuf[7];
//
CardId = SetxxBuf[0];
SioBurd = SetxxBuf[1];
DataFormat = SetxxBuf[2];
CardCs1 = SetxxBuf[3];
//擦除FLASH
FLASH_PageErase (FLASH_TEMP);
//设置写FLASH
FLASH_Write (FLASH_TEMP, SetxxBuf, 4);
//设置命令回答
Cmd_Ack();
}
//===============================================
//读本地口状态:读口状态并生成数据包
//===============================================
void Cmd_Ack(void)
{
ComTBuf[0] = ComRBuf[0]; //
ComTBuf[1] = ComRBuf[1];
ComTBuf[2] = ComRBuf[2];
ComTBuf[3] = 0; //'00'OK
ComTBuf[4] = ComRBuf[4];
ComTBuf[5] = ComRBuf[5];
ComTBuf[6] = ComRBuf[6]; //读P1口状态
ComTBuf[7] = ComRBuf[7];
ComTBuf[8] = ComRBuf[8];
//
RW485 = 1; //使能发送
ComTBufHead=1;
Sio_Lth = 9;
SBUF0 = ComTBuf[0]; //启动串口发送
}
//********************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -