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; //打开计数器
}
...全文
414 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
胜负多少 2015-07-22
  • 打赏
  • 举报
回复
既然串口中断开了,干嘛还在main函数中采用查询方式判断接收。。。。
of123 2015-07-22
  • 打赏
  • 举报
回复
“数据最后一组字节”是什么意思?你确认接收到了所有的数据?既然是不到 100 字节,为什么如下定义: #define MAXSIZE 10 unsigned char arr[MAXSIZE];
胜负多少 2015-07-22
  • 打赏
  • 举报
回复
引用 4 楼 am540 的回复:
@pppppp11 中断中再打开定时中断不太好,所以放到main中
问题是你打开串口中断,main函数还能运行吗?还有,你的定时器是用来做超时判断的吧,定时多少时间呢?
am540 2015-07-22
  • 打赏
  • 举报
回复
@pppppp11 中断中再打开定时中断不太好,所以放到main中
am540 2015-07-22
  • 打赏
  • 举报
回复
@of123 就是比如发送0x01,0x02,0x03,接收返回时只有0x02,0x03

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧