📄 serial_c1.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 + -