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