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

📄 serial_c1.c

📁 Small RTOS的Serial程序
💻 C
字号:
/*********************************************************************************************************
**				                               Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2003, houchunyuan
**                                           All Rights Reserved
**
**                                                  V1.00.0
**
**
**---------------------文件信息-------------------------------------------------------------------------
**文   件   名:	Serial_c.c
**创   建   人:	侯春元
**最后修改日期:	2006-8-3
**描      述: 	串行口驱动子程序代码
**				在陈明计的SmallRTOS v1.20.3中调用
**
**---------------------历史版本修订---------------------------------------------------------------------
** 修改人:	侯春元
** 日 期:	2006-7-26
** 描 述:	根据自己需要修改接口和格式
**
**---------------------当前版本修订----------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"


/*---------------------常量定义------------------------------------------------------------------------*/


/*---------------------变量定义------------------------------------------------------------------------*/

extern uint8 OS_Q_MEM_SEL CommandData[];
extern uint8 OS_Q_MEM_SEL SerialInData[];
extern uint8 OS_Q_MEM_SEL SerialOutData[];

bit SerialCanSend = 1;                      /* 正在发送标志,0:正在发送    */


/*---------------------函数代码------------------------------------------------------------------------*/

/*********************************************************************************************************
** 函数名称:	SerialInit
** 功能描述:	初始化串行口
** 输 入:		无
** 输 出:		无
** 全局变量:	无
** 调用模块:	无
**
** 作 者:		陈明计
** 日 期:		2002年12月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SerialInit()
{
	SCON = 0x50;
	PCON = 0x80;
	TMOD = TMOD & 0x0f;
	TMOD = TMOD | 0x20;
	TH1 = 0xf4;                   //com is 4800 b/s
	TL1 = 0xf4;
	TR1 = 1;
	ES = 1;	
}

/*********************************************************************************************************
** 函数名称:	PutChar
** 功能描述:	发送一个字节
** 输 入:		TempData	--	发送的数据
** 输 出:		无
** 全局变量:	无
** 调用模块:	无
**
** 作 者:		陈明计
** 日 期:		2002年12月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:		侯春元
** 修改内容:	发送数据放入消息队列,使之半双工下可用
				
** 日 期:		2006-8-3
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void PutChar(uint8 TempData)
{
    OS_ENTER_CRITICAL();
    
    if (SerialCanSend == 1)
    {
        SerialCanSend = 0;
        SBUF = Data;
    }
    else
    {
        OSQIntPost(SerialOutData,Data);
    }
    
    OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
** 函数名称:	Send
** 功能描述:	发送一个数据包
** 输 入:		TempData	--	指向要发送的数据指针
**				TempCnt		--	发送数据个数
** 输 出:		无
** 全局变量:	无
** 调用模块:	无
**
** 作 者:		陈明计
** 日 期:		2002年12月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:		侯春元
** 修改内容:	发送一组数据
** 日 期:		2006-8-3
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Send(uint8 OS_Q_MEM_SEL *TempData, uint8 TempCnt);
{
	uint8 TempPtr;
	uint8 TempI;
	
	PutChar(0x3a);						//	发送冒号字符':'

	for(TempPtr = TempData, TempI = 0; TempI < TempCnt; TempI ++, TempPtr ++)
		PutChar(*TempPtr);
}

/*********************************************************************************************************
** 函数名称:	CommInt
** 功能描述:	串口中断处理程序
** 输 入:		无
** 输 出:		无
** 全局变量:	无
** 调用模块:	无
**
** 作 者:		陈明计
** 日 期:		2002年12月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#pragma disable                                        /* 除非最高优先级中断,否则,必须加上这一句                 */

void CommInt(void) interrupt UART_ISR
{
    uint8 data TempBuf;
    
	if (RI == 1)
	{
        OS_INT_ENTER();
        
		RI = 0;
        OSQIntPost(SerialInData, SBUF);
        
        OSIntExit();
        
		return;
	}
	
	if (TI == 1)
	{
		TI = 0;
		if (OSQAccept(&temp,SerialOutData) == OS_Q_OK)
		{
		    SBUF = temp;
		}
		else
		{
		    SerialCanSend = 1;
		}
	}	
}

/*********************************************************************************************************
** 函数名称:	Receive
** 功能描述:	串口接收处理任务
** 输 入:		无
** 输 出: 		无
** 全局变量:	无
** 调用模块:	无
**
** 作 者: 		陈明计
** 日 期:		2002年12月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Receive(void)
{
    uint8 data TempBuf[5], TempBuf1;
    uint8 TempI;
    uint8 TempPtr;

                                                	/* 建立所需要的消息队列 */
    OSQCreate(CommandData, 16);
    OSQCreate(SerialInData, 16);
    OSQCreate(SerialOutData, 32);
    SerialInit();                               	/* 初始化串行口         */
    
    while (1)
    {
		for (TempPtr = TempBuf, TempI = 0; TempI < 5; TempI ++, TempPtr ++)
		{
	        OSQPend(TempPtr, SerialInData, 0);		// 接收一个字节
		}

                                               /* 发送消息1给主任务     */
		OSQPost(CommandData,1);
    }
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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