一个关于单片机串口通信的问题

功能就是向电脑不停的发字符串working#include<reg52.h>typedefunsignedcharuint8;typedefunsignedintuint... 功能就是向电脑不停的发字符串working

#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;

uint8 Buf[]="working\n" ;

void init(); //初始化函数
void sent_string(uint8 *buf); //发送字符串函数
void delay(uint16 t); //延时函数

main()
{
init();
while(1)
{
sent_string(Buf);
delay(20000) ;
}
}

void sent_string(uint8 *buf)
{
while(*buf!='\0')
{
SBUF=*buf++; //如果我关掉中断,用查询方式,后面写while(!TI);TI=0;为啥就可以?
}

}

void UART() interrupt 4
{
TI=0;

}

void init() //初始化函数
{
SCON=0X50;
TMOD=0X20;
TH1 =0XFD;
TL1 =0XFD;
TR1 =1;
ES =1;
EA =1;
}

void delay(uint16 t) //延时函数
{
while(t--);
}
这样什么都发不了。。。除了上面那个问题,还有我用keil调试,发现TI的值好像要发送完一个字符串才变1,不应该是发送完一个字符就变1吗?
我究竟错在哪了,望高人指点。
展开
 我来答
he_123456
2013-10-25 · TA获得超过2892个赞
知道大有可为答主
回答量:3162
采纳率:58%
帮助的人:1345万
展开全部

(1) SBUF=*buf++;   //如果我关掉中断,用查询方式,后面写while(!TI);TI=0;为啥就可以?

你要等到放在SBUF的一个字节发送结束,也就是TI被单片机置位后,才能再往SBUF放数据开始发送下一个字节。

所以,如果用查询方式,在SBUF=*buf++;  之后,要么就检测TI, 等到TI为1才往下走;要么就延时足够长时间才开始下一个字节的发送。

(2)除了上面那个问题,还有我用keil调试,发现TI的值好像要发送完一个字符串才变1,不应该是发送完一个字符就变1吗?

这个是由于你的串口中断服务程序里面把TI清零了呀

void UART() interrupt 4



        TI=0;


}

(3)如果想用中断方式发送,您的代码要改成这样子(只是练习,实用不建议,可能很不强壮)

#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;
uint8 Buf[]="working\n" ;
uint8 * buf1;
void init();                                  //?????
void sent_string(uint8 *buf);        //???????
void delay(uint16 t);                    //????
main()
{
 init();
 buf1=Buf;
 TI=1;
 while(1);
}

void UART() interrupt 4

  if(TI){
   TI=0;
   if(*buf1=='\0'){buf1=Buf;}
   SBUF=*buf1++;    
  }
}
void init()                                    //?????
{
 SCON=0X50;
 TMOD=0X20;
 TH1 =0XFD;
 TL1 =0XFD;
 TR1 =1;
 ES =1;
 EA =1;
}
kami03372
2013-10-25 · TA获得超过211个赞
知道小有建树答主
回答量:161
采纳率:0%
帮助的人:130万
展开全部
单片机是发完一个字符就会置位TI标志位的。
单片机发送一个字符需要时间的,这个你可以根据波特率计算出大概
只有前面一个字符发送完毕了(TI变成1了),才能发下一个字符(先把TI清0)
你一个字符串working
while(*buf!='\0')
{
SBUF=*buf++;
}
这是在不停的发,你没有顾及单片机的速度,肯定发送不出去的
你或者
while(*buf!='\0')
{
SBUF=*buf++;
delay(20);//这是数值要实验
}
每个字符之后都给他一个延时,也能发送出去的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2013-10-25 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38387
国家科技进步奖

向TA提问 私信TA
展开全部
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;

uint8 Buf[]="working\n" ;

void init(); //初始化函数
void sent_string(uint8 *buf); //发送字符串函数
void delay(uint16 t); //延时函数

main()
{
init();
while(1)
{
sent_string(Buf);
delay(20000) ;
}
}

void sent_string(uint8 *buf)
{
while(*buf!='\0')
{
if(TI==0)SBUF=*buf++; //如果我关掉中断,用查询方式,后面写while(!TI);TI=0;为啥就可以?
}

}

void UART() interrupt 4
{
if(TI)TI=0;

}

void init() //初始化函数
{
SCON=0X50;
TMOD=0X20;
TH1 =0XFD;
TL1 =0XFD;
TR1 =1;
ES =1;
EA =1;
}

void delay(uint16 t) //延时函数
{
while(t--);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式