📄 uart.c
字号:
/*
*/
#include "RTOS.h"
#define OWN_ADDRESS 1
bit bRecCommand,bRecData;
struct
{
union
{
uint uiaBuffer[260];
uchar ucaBuffer[520];
} Tx;
union
{
uint uiaBuffer[260];
uchar ucaBuffer[520];
} Rx;
union
{
uint uiRec;
uchar ucaRec[2];
} Length;
uint uiTxNumber,uiTxLength;
uint uiRxNumber;
} xdata Comm;
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
void UART(void) interrupt 4
{
static uchar c;
NOP(); NOP();
if(RI)//&RB8)
{
NOP(); NOP();
c=SBUF;
if(bRecData) // 接收数据,因为接收数据和程序执行最多次,所以放在最先
{
NOP(); NOP();
Comm.Rx.ucaBuffer[Comm.uiRxNumber]=c;
Comm.uiRxNumber++;
if(Comm.uiRxNumber>=Comm.Length.uiRec)
{
OSCreateTask(2); // 接收完数据,建立任务
}
}
else if(bRecCommand) // 接收命令或长度
{
if(Comm.Length.ucaRec[0]==0xff)
{
Comm.Length.ucaRec[1]=c; // 接收长度低字节
Comm.Length.ucaRec[0]=0;
}
else
{
Comm.Length.ucaRec[0]=c; // 接收长度高字节
bRecCommand=0;
bRecData=1;
}
}
else if((c==OWN_ADDRESS)&&(RB8==1)) // 接收地址
{
SM2=bRecData=0;
bRecCommand=1;
Comm.Length.ucaRec[0]=0xff;
Comm.uiRxNumber=0;
}
}
else if(TI) ////////////////////////////////////////// Transmited one byte
{
NOP(); NOP();
{
NOP(); NOP();
if(Comm.uiTxLength) // 发送数据
{
NOP(); NOP();
Comm.uiTxLength--; // 初始化时为发送数据长度
Comm.uiTxNumber++; // 初始化时为0
SBUF=Comm.Tx.ucaBuffer[Comm.uiTxNumber]; // next byte
NOP(); NOP();
}
}
}
RI=TI=0;
} // End function
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
void InitUART()
{
NOP(); NOP();
SCON=0xf0; // module 3,1bit start bit,8bit data bit,1bit check bit,1bit stop bit
TR2=C_T2=0;
RCLK=1; // causes Timer 2 overflows to be used for the receive clock.
TCLK=1; // causes Timer 2 overflows to be used for the transmit clock.
RCAP2L=0xfa; // 19200bps(11.0592MHz) // 0xee 19200bps; 0xfd 115200bps;0xfa 57600bps
RCAP2H=0xff;
////////////////////////////////////////////////////
SM2=1;
ES=TR2=PS=1; // Enable UART receive
NOP(); NOP();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -