?? uart.h
字號:
#define uchar unsigned char
#define uint unsigned int
//設置緩沖區最大長度
#define Buf_Len_Max 12
///////////狀態定義
#define Data_ok 0x80
#define Busy_fail 0x40
#define Len_fail 0x20
#define End_fail 0x10
#define CRC_fail 0x08
//全局
bit REC_Flag;
uchar UR_Control,UR_Datalen,Data[Buf_Len_Max];
uchar UR_Status;
//內部
uchar UR_CRC,Fuc_Point,Data_Point;
//***************************************************************************//
//描述:串口發送 uchar
//參數:入:d 發送數據
//聲明:Juggler 20071013 Xi,An EPGC
//注意:
//***************************************************************************//
void UART_Out(unsigned char d)
{
SBUF=(d);
while(!TI);
TI=0;
}
//***************************************************************************//
//描述:串口發送 word
//參數:入:d 發送數據
//聲明:Juggler 20071013 Xi,An EPGC
//注意:
//***************************************************************************//
void UART_Out_Int(int d)
{
unsigned char d0,d1;
d0=d;
d1=d>>8;
UART_Out(d1);
UART_Out(d0);
}
/*
//***************************************************************************
//描述:串口發送 uchar 以ASCII碼
//參數:入:d 發送數據 0-255
//聲明:Juggler 20071013 Xi,An EPGC
//注意:
//***************************************************************************
void UART_Char_Uchar(uchar d) //串口發送 int
{
uchar NUM[3],UCU_i;
bit UCU_Flag0=0; //顯示開關
NUM[0]=d/100; //逐位取碼
d%=100;
NUM[1]=d/10;
d%=10;
NUM[2]=d;
for(UCU_i=0;UCU_i<3;UCU_i++)
{
if(NUM[UCU_i]>0)UCU_Flag0=1;
if(UCU_Flag0==1)
{
UART_Out(0x30+NUM[UCU_i]); //數字轉換為ASCII碼
}
else if(UCU_i==2)UART_Out('0'); //為0則輸出'0'
}
}
//***************************************************************************
//描述:串口發送 int 以ASCII碼
//參數:入:d 發送數據 有符號區別
//聲明:Juggler 20071013 Xi,An EPGC
//注意:
//***************************************************************************
void UART_Char_Int(int d) //串口發送 int
{
uchar NUM[5],i;
bit UCI_Flag0;
if(d<0)
{
UART_Out('-');
d=d*(-1);
}
NUM[0]=d/10000;
d%=10000;
NUM[1]=d/1000;
d%=1000;
NUM[2]=d/100;
d%=100;
NUM[3]=d/10;
d%=10;
NUM[4]=d;
UCI_Flag0=0;
for(i=0;i<5;i++)
{
if(NUM[i]>0)UCI_Flag0=1;
if(UCI_Flag0==1)
{
UART_Out(0x30+NUM[i]);
}
else if(i==4)UART_Out('0');
}
}
//***************************************************************************
//描述:串口發送 Uint 以ASCII碼
//參數:入:d 發送數據 有符號區別
//聲明:Juggler 20071013 Xi,An EPGC
//注意:
//***************************************************************************
void UART_Char_Uint(uint d) //串口發送 int
{
uchar NUM[5],i;
bit UCI_Flag0;
NUM[0]=d/10000;
d%=10000;
NUM[1]=d/1000;
d%=1000;
NUM[2]=d/100;
d%=100;
NUM[3]=d/10;
d%=10;
NUM[4]=d;
UCI_Flag0=0;
for(i=0;i<5;i++)
{
if(NUM[i]>0)UCI_Flag0=1;
if(UCI_Flag0==1)
{
UART_Out(0x30+NUM[i]);
}
else if(i==4)UART_Out('0');
}
}
*/
//***************************************************************************//
//描述:串口初始化
//參數:無
//聲明:Juggler 20071013 Xi,An EPGC
//注意:
//***************************************************************************//
void UART_Init(void)
{
SCON = 0x50; //SCON: 8位異步收發,波特率可變,允許串口接收;
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON = 0x80; //SMOD=1;
TH1 = 0xFF; //Baud:115200 fosc=22.1184MHz
TR1 = 1; //timer 1 run
RI=0; //清標志
TI=0; //清標志
PS=1; //高優先級
ES=1; //中斷允許位
}
//***************************************************************************//
//描述:協議接收
//參數:無
//聲明:Juggler 20071013 Xi,An EPGC
//注意:
//***************************************************************************//
void UART_REC(void) interrupt 4 using 3 //串口接收
{
uchar UR_temp;
EA=0;
if(RI)
{
RI=0;
UR_temp=SBUF;
if(REC_Flag==1)//系統正在處理舊數據,數據無效
{
UR_Status=Busy_fail;
Fuc_Point=0 ;
}
else
{
if(Fuc_Point==0)//幀起始
{
if(UR_temp==0x55)//幀起始字節
{
Fuc_Point=1 ;//開始接收
}
else ; //無效
}
else if(Fuc_Point==1) //控制碼
{
UR_Control=UR_temp; //獲取控制碼
Fuc_Point=2 ; //指針指向數據長度域
}
else if(Fuc_Point==2) //數據長度
{
if(UR_temp==0) //沒有數據的命令幀
{
UR_Datalen=0;
UR_CRC=0;
Fuc_Point=4;
}
else if((UR_temp>0)&&(UR_temp<=Buf_Len_Max)) //數據長度大于0且小于緩沖區長度
{
UR_Datalen=UR_temp; //獲取長度
UR_CRC=0;
Fuc_Point=3; //指針指向數據域
Data_Point=0; //數據指針復位
}
else
{
UR_Status=Len_fail;
UART_Out(UR_Status);
Fuc_Point=0 ; //接收復位
}
}
else if(Fuc_Point==3)//有效數據
{
UR_CRC+=UR_temp;
Data[Data_Point++]=UR_temp; //獲取數據
if(Data_Point==UR_Datalen)
{
Fuc_Point=4 ; //指向校驗碼域
}
}
else if(Fuc_Point==4)//校驗
{
if(UR_CRC==UR_temp)
{
Fuc_Point=5 ; //校驗成功,指向結束碼域
}
else
{
UR_Status=CRC_fail ;//校驗失敗,無功而返
UART_Out(UR_Status);
Fuc_Point=0;
}
}
else if(Fuc_Point==5)
{
if(UR_temp==0x99) //得到結束碼
{
REC_Flag=1;
Fuc_Point=0; //接收復位
UR_Status=Data_ok;
UART_Out(UR_Status);
}
else //不是結束碼,無功而返
{
UR_Status=End_fail;
UART_Out(UR_Status);
Fuc_Point=0;
}
}
}
}
//else TI=0;
EA=1;
}
//***************************************************************************//
//描述:響應上位機
//參數:入:RSP 響應字 LEN 返回數據長度
//聲明:Juggler 20071013 Xi,An EPGC
//注意:如有返回數據(LEN不為0)則接收緩沖共用存儲空間Data[i],無沖突
//***************************************************************************//
void UART_Back(uchar RSP,uchar LEN)
{
uchar UB_i,UB_CRC;
UART_Out(0x55);
UART_Out(RSP);
UART_Out(LEN);
for(UB_i=0;UB_i<LEN;UB_i++)
{
UB_CRC+=Data[UB_i];
UART_Out(Data[UB_i]);
}
UART_Out(UB_CRC);
UART_Out(0x99);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -