求单片机串口中断接收程序,怎样一次性接受多个字符?

求单片机串口中断接收程序,怎样一次性接受多个字符?我这里写了一个程序只能接收一个字符,多个字符我就没办法了,跪求高人帮我改改中断服务函数,一次能接收多个字符。例如,用串口... 求单片机串口中断接收程序,怎样一次性接受多个字符?
我这里写了一个程序只能接收一个字符,多个字符我就没办法了,跪求高人帮我改改中断服务函数,一次能接收多个字符。例如,用串口调试助手发送0123456789.能在串口助手接收显示窗上显示0123456789.
#include<reg52.h>

unsigned char flag,i,a;

unsigned char code table[6]="I get ";

void init()
{
TMOD=0x20; //设定定时器工作方式2
TH1=0xfd; //定时器1装入初值
TL1=0xfd; //同上
TR1=1; //启动T1定时器

SM0=0; //设定工作方式1
SM1=1; //同上
REN=1; //允许串口接收
EA=1; //开总中断
ES=1; //开串口中断
}

void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}

void ser() interrupt 4 //中断程序,接收数据块,标志位置1
{
RI=0;
a=SBUF;
flag=1;
}
展开
 我来答
wsxtg
推荐于2018-03-19 · TA获得超过3794个赞
知道小有建树答主
回答量:1794
采纳率:0%
帮助的人:1184万
展开全部
首先把变量a定义成一个数组a[10],数组大小,根据要接收的字符确定.再加一个变量J.
在开中断ES=1后,加一个延时函数.我用过很多这样的了.请多给点分,以后我还可以帮你.程序如下:
#include<reg52.h>

unsigned char flag,i,j;
unsigned int k;
unsigned char a[10];

unsigned char code table[6]="I get ";

void init()
{
TMOD=0x20; //设定定时器工作方式2
TH1=0xfd; //定时器1装入初值
TL1=0xfd; //同上
TR1=1; //启动T1定时器

SM0=0; //设定工作方式1
SM1=1; //同上
REN=1; //允许串口接收
EA=1; //开总中断
ES=1; //开串口中断
}

void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
ES=1;
for(k=0;k<0xffff;k++);
for(i=0;i<j;i++)
{
SBUF=a[i];
while(!TI);
TI=0;
}
flag=0;
}
}
}

void ser() interrupt 4 //中断程序,接收数据块,标志位置1
{
RI=0;
a[j]=SBUF;
flag=1;
j+=1;
}
百度网友e265721
2010-07-05 · TA获得超过121个赞
知道答主
回答量:66
采纳率:0%
帮助的人:0
展开全部
我大概说说吧,串口通信程序一般是在一定的通信协议下进行的。数据都是一帧一帧发送的,都是有时间间隔的,一般是毫秒级。接收数据的时候就是要判断一帧完整的数据接收完全了再做相应的处理。判断的依据就是这个间隔了一段时间总线上没有数据了(时间间隔),然后清零接收缓存区。再准备下一次接收。

对于你的程序而言就是现在缺少接收数据超时判断,用定时器判断就行。有一段时间没有数据就清零接收缓存。而不是用for语句,这样只能接收有限而且固定的数据,只要有数据来我都接受,直到一帧数据接收完成(时间间隔)这样你发几个数,我就接几个。比较灵活吧。你需要写个发送一个字节数据的函数。多读别人的程序,对你会有比较大的启发。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式