uart.c
来自「MCS51的实现无线接收发送(315M或433M)源程序代码。」· C语言 代码 · 共 167 行
C
167 行
/**********************************************************
* Uart.c *
**********************************************************/
#define UART_GLOBALS
//=========================================================
#include "Sm5964.h"
#include "Struct.h"
#include "Tools.h"
#include "Hardware.h"
#include "Os.h"
#include "TmrTsk.h"
#include "TskMan.h"
#include "Error.h"
#include "Tmr2.h"
#include "Uart.h"
#include "..\Port.h"
#include "..\ApplyStruct.h"
#include "..\RfServer.h"
//=========================================================
#define DEBUG_UART 0
//=========================================================
static INT8UI UartSendIndex;
static INT16UI UartResendTime;
static BOOLEANI HdlFlag;
//=========================================================
void InitUart(void)
{
INT32U BaudValue;
TR1=0;
PCON=0X80; //波特率加倍
SCON=0X70; //SM0,SM1,SM2,REN,TB8,RB8,TI,RI;10位异步收发,由定时器控制.
TMOD&=0X0F;
TMOD|=0X20; //定时器1的工作方式为方式2,8位重载.
if(PCON&0X80) BaudValue=0x100-FREQ*2/32/12/BAUD;
else BaudValue=0x100-FREQ/32/12/BAUD;
TL1=BaudValue;
TH1=TL1;
ET1=0; //定时器1中断标志位复位.
PT1=1;
PS=1; //串口的中断优先级为高优先级.
TR1=1; //TR1:timer 1 run
TI=0;
RI=0;
ES=1;
}
//=========================================================
static void UartRdTmrProc(void)
{
#if DEBUG_UART
//MDebugStrLF((INT8UC *)"UartRdTmrProc()");
#endif
if(UartRdIndex!=UartWrIndex)
{
if(HdlFlag==false) SendTskMsg(UARTTSKID,MSG_UARTRECV,0);
}
else UartRdIndex=UartWrIndex=0;
}
//=========================================================
static void UartResendTmrProc(void)
{
#if DEBUG_UART
//MDebugStrLF((INT8UC *)"UartResendTmrProc()");
#endif
SendTskMsg(UARTTSKID,MSG_UARTSEND,0);
}
//=========================================================
void PostToUartSendQ(INT16U Time)
{
#if DEBUG_UART
//MDebugStrLF((INT8UC *)"PostToUartSendQ()");
#endif
ReverseX(UartSendBuf,UartSendLen);
#if DEBUG_UART
MDebugExMemHex(UartSendBuf,UartSendLen);
#endif
UartResendTime=Time;
SendTskMsg(UARTTSKID,MSG_UARTSEND,0);
}
//=========================================================
void CancelUartResend(void)
{
#if DEBUG_UART
//MDebugStrLF((INT8UC *)"CancelUartResend()");
#endif
StopTmr(UARTRESENDTMRID);
UartSendLen=0;
}
//=========================================================
void InitUartTsk(void)
{
InitUart();
UartRdIndex=0;
UartWrIndex=0;
UartSendLen=0;
UartSendIndex=0;
HdlFlag=false;
#if DEBUG_UART
MDebugStrLF((INT8UC *)"InitUartTsk()");
#endif
InitExMemBuf(UartRecvBuf,0X00,sizeof(UartRecvBuf));
InstallTmr(UARTRDTMRID,UartRdTmrProc);
InstallTmr(UARTRESENDTMRID,UartResendTmrProc);
}
//=========================================================
static void HdlUartRecv(void)
{
if(HdlFlag) return;
HdlFlag=true;
#if DEBUG_UART
MDebugStrLF((INT8UC *)"HdlUartRecv()");
#endif
HdlUartData();
UartRdIndex=UartWrIndex=0;
HdlFlag=false;
}
//=========================================================
static void HdlUartSend(void)
{
#if DEBUG_UART
//MDebugStrLF((INT8UC *)"HdlUartSend()");
#endif
StartTmr(UARTRESENDTMRID,UartResendTime);
if(UartSendLen)
{
UartSendIndex=UartSendLen-1;
SBUF=UartSendBuf[UartSendIndex];
}
}
//=========================================================
void UartTskEntry(void)
{
#if DEBUG_UART
//MDebugStrLF((INT8UC *)"UartTskEntry()");
#endif
if(TskMsg.MsgId==MSG_UARTRECV) HdlUartRecv();
else if(TskMsg.MsgId==MSG_UARTSEND) HdlUartSend();
else ErrExit(ERR_UARTMSGTYPE);
}
//=========================================================
//=========================================================
void Uart0 (void) interrupt COM0_VECTOR using 2
{
EA=0;
if(RI==1)
{
RI=0;
UartRecvBuf[UartWrIndex++]=SBUF;
if(UartWrIndex>=UARTRECVBUFSIZE) UartWrIndex=0;
DelayTime[UARTRDTMRID]=3;
}
if(TI==1)
{
TI=0;
if(UartSendIndex!=0) SBUF=UartSendBuf[--UartSendIndex];
}
EA=1;
}
//=========================================================
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?