📄 uart.c
字号:
/*************************************************/
//项 目:水利数码通
//文件名:UART.C
//功 能: 串口0、1数据收发处理,软件串口处理
//作 者:杨世峰
//日 期:2004-03-13
/*************************************************/
//================包含文件=========================
#include "upsd3300.h"
#include "const.h"
#include "hardware.h"
#include "uart.h"
#include "GPRS_API.h"
#include "upsd3300_timer.h"
//=================宏定义==========================
//================变量定义=========================
extern uint idata unInBufCntComm0; //缓冲区计数
extern uint idata unInBufCntComm1; //缓冲区计数
extern uchar xdata InBufComm0[];
extern uint idata InHeadComm0; //队列头
extern uint idata InTailComm0; //队列尾
extern uchar xdata InBufComm1[];
extern uint idata InHeadComm1; //队列头
extern uint idata InTailComm1; //队列尾
extern bit bSelectGPS;
//================函数定义=========================
//-------------------------------------------------
// serial0 initial for hw006
// bautrate :BAUT0
// bautrate generator timer2
//-------------------------------------------------
void Serial0_Init(uchar ucBaut)
{
ulong ulTemp;
ES0 = 0;
SCON0 |= 0X50; //mode 1 ,receive enable
//T2CON
RCLK = 1; //timer2 used for baut generator
TCLK = 1;
C_T2 = 0; //TIMER
EXEN2 = 0; //disable the t2x
//UART Mode 1,3 Baud Rate =
//fOSC/(32 x [65536 – [RCAP2H, RCAP2L]))
switch(ucBaut)
{
case 5:
ulTemp=9600;
break;
case 6:
ulTemp=19200;
break;
case 7:
ulTemp=38400;
break;
case 8:
ulTemp=57600;
break;
case 9:
ulTemp=115200;
break;
default :
ulTemp=9600;
}
RCAP2 = - (uint)(22118400L/32/ulTemp);//FREQ_OSC IS KHZ
TH2 = RCAP2H;
TL2 = RCAP2L;
P3SFS |= 0x03;//0,1:RXD0,TXD0,XXXXXX11,
//pcon |= 0x80;//smod0 = 1;
TR2 = 1;
PS0 = 1;//priorty high
ES0 = 1;
}
//--------------------------------------------------
// serial1 initial for gps 或GPRS
// bautrate :BAUT1
// bautrate generator timer1
//--------------------------------------------------
void Serial1_Init(uchar ucBaut)
{
ulong ulTemp;
IEA &= 0xEF; //ES1 = 0
TR1 = 0; //stop timer1
SCON1 = 0X50; //REN1 = 1,mode 1
TMOD &= 0X0f;
TMOD |= 0X20; //8bits auto load
PCON|=0X40; //baut *2,smod1
//Mode 1,3 Baud Rate =
//(2^SMOD1 / 32) x (fOSC / (12 x [256 – (TH1)]))
switch(ucBaut)
{
case 4://4800
ulTemp = 9600;
PCON&=0xbf;//波特率不加倍
break;
case 5:
ulTemp=9600;
break;
case 6:
ulTemp=19200;
break;
case 7:
ulTemp=38400;
break;
case 8:
ulTemp=57600;
break;
case 9:
ulTemp=115200;
break;
default:
ulTemp=38400;
}
TH1 = - (char)(2*22118400L/32/12/ulTemp);
TL1 = TH1;
P1SFS0 |= 0x0C;//2,3:RXD1,TXD1, XXXX11XX
P1SFS1 &= 0xF3;//XXXX00XX
IPA |= 0x10; //priority is high
TR1 = 1;
IEA |= 0x10; //enable uart1
}
//------------------------------------------------
// function:void comm0putchar(uchar ch)
// send one char from comm0
//note: no interrupt
//------------------------------------------------
void SendCharComm0(uchar ch)
{
// ES0 =0;
SBUF0 = ch;
while( TI == 0);
TI = 0;
// ES0 = 1;
}
//---------------------------------------------------
// function:read one char from buff
//---------------------------------------------------
bit ReadCharComm0(uchar *ch)
{
if(unInBufCntComm0 == 0) return 0; //缓冲空
*ch = InBufComm0[InHeadComm0++];
InHeadComm0 %= INBUFLENCOMM0; //读尽缓冲区,队列头返回0
unInBufCntComm0--;
return 1;
}
//--------------------------------------------------
//clearcomm0buff
//--------------------------------------------------
void ClearBuffComm0(void)
{
ES0 = 0;
unInBufCntComm0 = 0;
InTailComm0 = InHeadComm0 = 0; //clear comm0 buff
ES0 = 1;
// unOutBufCntComm0 = 0;
// OutTailComm0 = OutHeadComm0 = 0;
}
//--------------------------------------------------
// SendBuffCommm0()
// send sum chars from comm0
//--------------------------------------------------
/*
void SendBuffComm0(uchar *pb,uint sum)
{
uint idata i;
for(i=0;i<sum;i++)
{
SendCharComm0(pb[i]);
}
}
*/
//------------------------------------------------
// function:void comm1putchar(uchar ch)
// send one char from comm1
//------------------------------------------------
void SendCharComm1(uchar ch)
{
// IEA &= 0xef; //ES1 =0
SBUF1 = ch;
while(TI1 == 0); //TI1 != 1
TI1 = 0; //TI1 = 0
// IEA |= 0x10; //ES1 = 1;
}
//---------------------------------------------------
// function:read one char from buff1
//---------------------------------------------------
bit ReadCharComm1(uchar *ch)
{
if(unInBufCntComm1 == 0) return 0; //缓冲空
*ch = InBufComm1[InHeadComm1++];
InHeadComm1 %= INBUFLENCOMM1; //读尽缓冲区,队列头返回0
unInBufCntComm1--;
return 1;
}
//-----------------------------------------------
//void ClearBuffComm0(void);
//-----------------------------------------------
void ClearBuffComm1(void)
{
IEA &= 0xef; //ES1 =0
unInBufCntComm1 = 0;
InHeadComm1 = 0;
InTailComm1 = 0;
// unOutBufCntComm1 = 0;
// OutHeadComm1 = 0;
// OutTailComm1 = 0;
IEA |= 0x10; //enable uart1
}
//--------------------------------------------------
// SendBuffCommm1()
// send sum chars from comm1
//--------------------------------------------------
void SendBuffComm1(uchar *pb,uint sum)
{
uint idata i;
for(i=0;i<sum;i++)
{
SendCharComm1(pb[i]);
}
}
//--------------------------------------------------
// CTSSendBuffCommm1()
// send sum chars from comm1,check cts
//--------------------------------------------------
void CTSSendBuffComm1(uchar *pb,uint sum)
{
uint idata i;
for(i=0;i<sum;i++)
{
while(GPRS_CTS_Statue());
SendCharComm1(pb[i]);
}
}
//========================================
// END OF SOFTWAVE UART2 CODE
//========================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -