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 + -
显示快捷键?