一个关于单片机串口通信的问题
功能就是向电脑不停的发字符串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吗?
我究竟错在哪了,望高人指点。 展开
#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吗?
我究竟错在哪了,望高人指点。 展开
展开全部
(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;
}
展开全部
单片机是发完一个字符就会置位TI标志位的。
单片机发送一个字符需要时间的,这个你可以根据波特率计算出大概
只有前面一个字符发送完毕了(TI变成1了),才能发下一个字符(先把TI清0)
你一个字符串working
while(*buf!='\0')
{
SBUF=*buf++;
}
这是在不停的发,你没有顾及单片机的速度,肯定发送不出去的
你或者
while(*buf!='\0')
{
SBUF=*buf++;
delay(20);//这是数值要实验
}
每个字符之后都给他一个延时,也能发送出去的
单片机发送一个字符需要时间的,这个你可以根据波特率计算出大概
只有前面一个字符发送完毕了(TI变成1了),才能发下一个字符(先把TI清0)
你一个字符串working
while(*buf!='\0')
{
SBUF=*buf++;
}
这是在不停的发,你没有顾及单片机的速度,肯定发送不出去的
你或者
while(*buf!='\0')
{
SBUF=*buf++;
delay(20);//这是数值要实验
}
每个字符之后都给他一个延时,也能发送出去的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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--);
}
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--);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询