⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 基本STC4052写的一个小的OS, 完成了任务调度功能,及堆栈空间切换, 及中断处理
💻 C
字号:
//---------------------------------------------------------------
//      
//       Copyright (c) 2006-2007 E-compass electronic Co.,Ltd.               
//       All Right Reserved.                                     
//                                                               
//       $Author    walnutcy
//       $Email     walnutcy@gmail.com              
//       $Version   v1.0  
//       $FileName                                       
//       $Since                                            
//       $Log                                                    
//                                                               
//       DESCRIPTION   
//
//		 History:         
//		 <author>          <time>     <version >    <desc> 
//---------------------------------------------------------------

#include "..\includes.h"


BOOL gbRxValid;// global receive valid
BOOL gbRxFinish;
IU8 gu8RxBuf[MAX_SERIAL_BUFFER_LEN];// global receive pack buffer

U8 gUartPrinterNo;



U8 lSrlRvLen ;//receive length
U16 lSrlByteTime; // byte interval time


void SRL_RevChar(U8 rvch)	REENTRANT
{
    if  (BYTE_INTERVAL_TIME < (GetSysTime() - lSrlByteTime))//500ms
    {
        gbRxValid = 0;
        lSrlRvLen = 0;
    }
	if (!gbRxValid)
	{
	  	if ( SERIAL_FRAME_START == rvch)
	  	{
	  		gbRxValid = 1;// start receive            	  		      
	  	}
	}
	if (gbRxValid)
	{
	  	gu8RxBuf[lSrlRvLen] = rvch;
        lSrlRvLen ++;
        if (1 < lSrlRvLen)
        {
        	 if ( (gu8RxBuf[1] + 3) <= lSrlRvLen)
        	 {
                 if (SERIAL_FRAME_END == rvch)
                 {
        	  	     gbRxFinish = 1;
					 OsSendMsg(TASK_UART);					 
                 }
        	  	 lSrlRvLen = 0;
        	  	 gbRxValid = 0;//end receive
        	}
        }
        lSrlByteTime = GetSysTime();
	}
//	if (gbRxFinish)
//	{
//		OsSendMsg(TASK_UART);
//	}
}

// functions ...

void SRL_Init()	REENTRANT// Initialize the serial communication
{
    gbRxValid = 0;
    gbRxFinish = 0;
	lSrlRvLen = 0;//receive length
	lSrlByteTime = 0; // byte interval time

	gUartPrinterNo = 0xFF;

    SCON = 0x50;
   	TMOD |= 0x20;// timer1, mode-2, 8-bit reload
    // 96 : 9600------
    // 192: 19200-----
    // 115: 115200----(only in stc12 series)
//    SRL_SetPaud(192); // 115200
    PCON |= 0x80;// SMOD = 1;
    TH1 = 0xfd;  // Baud: 19200, fosc = 11.0592MHz
    TL1 = 0xfd;
	PS = 0;  // Serial interrupt first
	TR1 = 1;
    return;
}

U8 SRL_GetRevPack(U8* cmd, IU8* databuf) REENTRANT// return databuf length
{
    U8 len;
	S8 j;
    IU8 *tempbuf;
    if (gbRxFinish)
    {
	    len = gu8RxBuf[1] - 1;
	    tempbuf = &gu8RxBuf[3];
	    *cmd = gu8RxBuf[2];
		j = len;
	    while (j-- > 0)
	    {
	        *databuf++ = *tempbuf++; 
	    }
        gbRxFinish = 0; 
	    return len;
    }
    return 0;
}

void SRL_SendPack(U8 cmd, IU8* databuf, U8 len)	  REENTRANT
{
    SBUF = SERIAL_FRAME_START;
	while (!TI);
	TI = 0;
    SBUF = len+1;
	while (!TI);
	TI = 0;
    SBUF = cmd;
	while (!TI);
	TI = 0;
    while (len-- > 0)
    {
		SBUF = *databuf++;
		while (!TI);
		TI = 0;
    }
    SBUF = SERIAL_FRAME_END;
	while (!TI);
	TI = 0;
}

void UartPrint(U8* str)  REENTRANT
{
	while (*str)	
	{
	    SBUF = *str++;
		while (!TI);
		TI = 0;
	}
}

void UartReq (void) REENTRANT
{
	 while (1)
	 {
	   	EnterCritical();   //进入临界段
	   	if(gUartPrinterNo==0xFF)    //如果打印机没有被占用
	    {
	     	gUartPrinterNo = OsCurrId();   //则占用打印机,之所以加1,是为了使0号任务也能使用打印机
	                                  //当一个任务被删除,需要检查是否占有资源时要特别注意,
	                                  //读得的此号,要减1才是任务的ID号
	
	     	ExitCritical();  //退出临界段
	     	break;              //返回
	    }
	   	else                   //如果打印机已经被占用
	    {
	     	ExitCritical();  //退出临界段
	     	OsDelay(1);    //等待1个时钟节拍后再检查
	    }
	  }
}

void UartFree (void) REENTRANT
{		
	EnterCritical();
	UARTFreePrinter();        //让出打印机使用权
	ExitCritical();
	OsDelay(1);           //延迟一个时钟,让别的设备有机会获取打印机
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -