stc单片机串口收发的问题【急求高手解答】
am540 2015-07-22 09:48:51 我想让串口在一定时间内接收不定长的字节(最多100字节),然后统一发送出来。但是数据最后一组字节总是没有发送出,部分程序如下 求高手解答
#include<reg51.h>
#include <stdlib.h>
#include<intrins.h>
//--定义全局函数--//
#define MAXSIZE 10
unsigned char arr[MAXSIZE];
//开始状态
bit beginStat=0;
//结束状态
bit endStat=0;
//数组计数
unsigned char arrCnt=0;
//数组总数
unsigned char arrNum=0;
//中断计数用
unsigned char intCnt=0;
//--声明全局函数--//
void UsartConfiguration();
void StatInit(void);
void Timer0Init(void);
void Timer2Init(void);
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
UsartConfiguration();
StatInit();
while(1)
{
if(RI)
{
if(!beginStat) //第一个字节读入
{
beginStat=1;
arr[arrCnt++]=SBUF;
Timer0Init(); //打开定时器
}
else
{
arr[arrCnt++]=SBUF; //出去接收到的数据
}
RI=0;
}
if(endStat||arrCnt==MAXSIZE)
{
TR0=0; //中断定时
StatInit();
}
}
}
/*******************************************************************************
* 函 数 名 :StatInit()
* 函数功能 :状态初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void StatInit()
{
beginStat=0;
endStat=0;
arrCnt=0;
intCnt=0;
EX0=0;
}
/*******************************************************************************
* 函 数 名 :Timer0Init()
* 函数功能 :定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init(void) //71毫秒@11.0592MHz
{
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
EA=1;
ET0=1;
TR0 = 1; //定时器0开始计时
}
/*************************************
定时器0的中断号
*************************************/
void T0Interrupt(void) interrupt 1
{
intCnt++;
if(intCnt>=20)
{
if(!endStat)
{
endStat=1;
TR0=0; //中断定时
}
}
TL0 = 0x00;
TH0 = 0x00;
}
/*******************************************************************************
* 函 数 名 :UsartConfiguration()
* 函数功能 :设置串口
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UsartConfiguration()
{
PCON=0X80; //波特率加倍
SCON=0X50; //设置为工作方式1
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD=0x20; //设置计数器工作方式2
TH1=0xF3; //计数器初始值设置,注意波特率是4800的
TL1=0xF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}