📄 uart1.c
字号:
//*********************************************************
// 项 目: 通用控制器-V1.0
// 文件名: Uart1.C
// 描 述: 串口1中断服务程序
//*********************************************************
//===============================================
#include <All.h> //全部头文件
//===============================================
//***********************************************
//变量定义
//***********************************************
extern bit Len_ok; //收到包长标志
extern bit Com_ok; //收到命令标志
extern bit Head_ok; //发现包头标志
extern bit Com1_busy; //串口1 忙
UINT idata Data_len; //数据长度
UINT idata TX1_CNT,TX1_BUF; //串口1发长度
UINT idata RX1_CNT,RX1_BUF; //串口1收长度
UCHAR xdata Com1TBuf[Com1TBuf_len] _at_ Com1TBuf_addr;
UCHAR xdata Com1RBuf[Com1RBuf_len] _at_ Com1RBuf_addr;
//***********************************************
//函数开始
//***********************************************
//------------------------------------------------------
//初始化UART1
//------------------------------------------------------
void init_com1(void) //初始化串口1
{
ClearCom1RBuf(); //清发送、接收缓冲区
OpenCom1(); //设置串口1
}
//-----------------------------------------------
void ClearCom1RBuf(void) //清发送、接收缓冲区
{
unsigned int i;
unsigned int j; //接收缓冲很大
TX1_CNT=TX1_BUF=0; //清发长度
RX1_CNT=RX1_BUF=0; //清收长度
for (i=0;i<Com1TBuf_len;i++)
{ Com1TBuf[i]=0; } //清发送缓冲区
for (j=0;j<Com1RBuf_len;j++)
{ Com1RBuf[j]=0; } //清接收缓冲区
}
//-----------------------------------------------
void OpenCom1(void) //初始化UART1
{
T4CON = 0x00;
RCAP4L = 0xdc;//0xfd;//0xfa;//0xdc;// //115200//57600//9600bps
RCAP4H = 0xff;
T4CON |= 0x34; //启动Timer4
TX1_CNT=0; //清发长度
RX1_CNT=0; //清收长度
Com1_busy=0; //置串口闲
EIE2 |= 0x40; //允许串口1中断
SCON1 = 0x50; //串口1方式1,允许接收,清接断标志
}
//--------------------------------------------------------------------
void Comm1ISR(void) interrupt 20 //UART1中断处理程序
{
bit TI1,RI1;
unsigned char temp1;
unsigned char temp2;
temp1 = SCON1&0x01;
RI1 = temp1^0; //串口1收中断标志
temp1 = SCON1;
temp2 = (temp1>>1)&0x01;
TI1 = temp2^0; //串口1发中断标志
//****************************************************
if (_testbit_(TI1))
{
SCON1 &= 0xFD; //清发中断标志
if (TX1_CNT) //非0发下字节
{
SBUF1=Com1TBuf[TX1_BUF]; //发一个字节
TX1_BUF++; //指针+1
TX1_CNT--; //长度-1
}
else
{
TX1_BUF=0; //复位发指针
Com1_busy=0; //串口1 空闲
}
}
//****************************************************
if (_testbit_(RI1))
{
SCON1 &= 0xFE; //清收中断标志
Com1RBuf[RX1_BUF]=SBUF1; //接收数据
//-------------------------------------
if ( (SBUF1==0x14) && //本字节为14
(Com1RBuf[RX1_BUF-1]==0xff) && //上字节为FF
(!Len_ok) ) //没收到长度
{
RX1_BUF=1;
Head_ok=TRUE; //发现包头
}
if ( (RX1_BUF==3)&&(Head_ok) )
{
Len_ok=TRUE; //收到长度了
Data_len=Com1RBuf[2]*0x100+
Com1RBuf[3]; //保存长度
}
RX1_BUF++; //存储指针+1
if (RX1_BUF>=Com1RBuf_len) //包长异常
{
Com_ok=0;
RX1_BUF=0;
Len_ok=0;
Head_ok=0; //重新开始
}
if ( (Len_ok) &&
(RX1_BUF==(Data_len+7)) ) //长度到了
{
if (SBUF1==3) //ETX校验
// && (Com1RBuf[7]==1) //RID校验
{
Com_ok=1; //包有效
RX1_BUF=0; //恢复指针
Len_ok=0;
Head_ok=0;
Com1RBuf[0]=0xff; //补充包头
Com1RBuf[1]=0x14;
Com1RBuf[2]=0x00;
}
else
{
Com_ok=0; //包无效
RX1_BUF=0; //恢复指针
Len_ok=0;
Head_ok=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -