#include "STC8Axx.h"
#include "Uart1.h"
#include "Sys.h"
#include <intrins.h>
#include <stdio.h> //用于printf
#include <stdarg.h> //用于vsprintf函数原型
bit bUart1Busy;
bit bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
bit bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
unsigned char Uart1CurrentReceiveLength = 0; //串口1当前接收数据的长度
unsigned char Uart1ReceiveDataBuf[kUart1ReceiveMaxLength]; //串口1接收到的数据[串口1接收数据最大长度]
unsigned char Uart1SendDataBuf[kUart1SendMaxLength]={0xAA,0x00,0x00,0xBB}; //串口1发送数据[串口1接收数据最大长度]
//------------------------------------------------------------------------------
//读取串口1中断处理数据(字符串)(判断命令头,命令尾)
//------------------------------------------------------------------------------
void Uart1_ReadInterruptDataManage()
{
Sys_CheckIAP(SBUF); //系统_检测是否需要进入下载模式
if(bIsUart1ReceiveCommandHead == 0) //是否接收到命令头 (1: 表示是 0: 表示否)
{
if(SBUF == 0xCC)
{
bIsUart1ReceiveCommandHead = 1; //是否接收到命令头 (1: 表示是 0: 表示否)
Uart1CurrentReceiveLength = 0; ///串口1当前接收数据的长度
Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
}
}
else
{
Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
if(SBUF == 0xDD)
{
bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
bUart1ReceiveFinish = 1; //串口1接收完成标志 (1: 表示是 0: 表示否)
}
if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength) //串口1当前接收数据的长度 >=
{
bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
}
}
}
------------------------------------------------------------------------------
读取串口1中断处理数据(字符串)(判断命令头,命令尾,长度,有校验)
------------------------------------------------------------------------------
//void Uart1_ReadInterruptDataManage2()
//{
// if(bIsUart1ReceiveCommandHead == 0) //是否接收到命令头 (1: 表示是 0: 表示否)
// {
// if(SBUF == kUart1CommandStart)
// {
// bIsUart1ReceiveCommandHead = 1; //是否接收到命令头 (1: 表示是 0: 表示否)
// Uart1CurrentReceiveLength = 0; ///串口1当前接收数据的长度
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// }
// }
// else
// {
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// if((Uart1CurrentReceiveLength > 2) && (Uart1CurrentReceiveLength >= Uart1ReceiveDataBuf[1]))
// {
// if(Uart1ReceiveDataBuf[Uart1CurrentReceiveLength-1] == kUart1CommandEnd)
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 1; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// else
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// }
// if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength) //串口1当前接收数据的长度 >=
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// }
//}
//
------------------------------------------------------------------------------
读取串口1中断处理数据(字符串)
------------------------------------------------------------------------------
//void Uart1_ReadInterruptDataManage()
//{
// if(bIsUart1ReceiveCommandHead == 0) //是否接收到命令头 (1: 表示是 0: 表示否)
// {
// if(SBUF == '[')
// {
// bIsUart1ReceiveCommandHead = 1; //是否接收到命令头 (1: 表示是 0: 表示否)
// Uart1CurrentReceiveLength = 0; ///串口1当前接收数据的长度
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// }
// }
// else
// {
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// if(SBUF == ']')
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 1; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength) //串口1当前接收数据的长度 >=
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// }
//}
//------------------------------------------------------------------------------
//串口1中断函数
//------------------------------------------------------------------------------
void Uart1_Isr() interrupt 4 using 1
{
if (TI)
{
TI = 0;
bUart1Busy = 0;
}
if (RI)
{
RI = 0;
Uart1_ReadInterruptDataManage(); //读取串口1中断处理数据
}
}
//------------------------------------------------------------------------------
//串口1_切换
//------------------------------------------------------------------------------
void Uart1_Swap()
{
P_SW1 = 0x00; //RXD/P3.0, TXD/P3.1
// P_SW1 = 0x40; //RXD_2/P3.6, TXD_2/P3.7
// P_SW1 = 0x80; //RXD_3/P1.6, TXD_3/P1.7
// P_SW1 = 0xc0; //RXD_4/P4.3, TXD_4/P4.4
}
//------------------------------------------------------------------------------
//串口1_初始化
//------------------------------------------------------------------------------
void Uart1_Init()
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = kUart1_BRT;
TH1 = kUart1_BRT >> 8;
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
Uart1_Swap(); //串口1_切换
ES = 1; //打开串口1中断
bUart1Busy = 0;
}
------------------------------------------------------------------------------
串口1_发送一个字符
------------------------------------------------------------------------------
//void Uart1_SendChar(unsigned char dat)
//{
// while (bUart1Busy);
// bUart1Busy = 1;
// SBUF = dat;
//}
------------------------------------------------------------------------------
串口1_发送字符串
------------------------------------------------------------------------------
//void Uart1_SendString(unsigned char *p)
//{
// while (*p)
// {
// Uart1_SendChar(*p++);
// }
//}
///**********************************************************************************
// * @brief 串口1发送函数
// * @param arr:被发送数据的地址
// * @param len:被发送数据的长度
// * @retval 发送结果
// **********************************************************************************/
//void Uart1_Sendarray(u8* arr,u8 len)//串口1发送数组
//{
// u8 i=0;
// for(i=0;i<len;i++)
// {
// Uart1_SendChar(arr[i]);
// }
//}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char c)
{
if(c=='\n')//如果遇到\n就换行
{
//发送CR(carriage return)
SBUF=0x0D;
while(!TI);//等待发送完成
TI=0;
//发送 LF(NL line feed,new line)
SBUF=0x0A;
while(!TI);//等待发送完成
TI=0;
}
else
{
SBUF=c;
while(!TI);//等待发送完成
TI=0;
}
}
/*------------------------------------------------
发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
{
SendByte(*s);
s++;
}
}
/*------------------------------------------------
发送一个指定类型数据
------------------------------------------------*/
void Uart1_printf(const char *fmt,...)
{
va_list ap;
char xdata string[50];//访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024)
va_start(ap,fmt);
vsprintf(string,fmt,ap);//此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去
SendStr(string);
va_end(ap);
}
使用方法:
?? ?Uart1_printf("OK!\r\n"); ?? ?Uart1_printf("开始命令%bd\r\n",char); //调试输出 ?? ?Uart1_printf("开始命令%d\r\n",int); //调试输出 ?? ?Uart1_printf("开始命令%ld\r\n",long); //调试输出
|