51单片机串口通信

a091003040421 2013-09-04 09:20:17
我设计了一个发送五位字符的程序,通信时串口调试助手向单片机发送五个字符例如“12345”单片机第一次接收并回显到调试助手时只有前四位“1234”只有在第二次发送后才能收到第五位例如再次发送“12345”会收到“51234”以后每次收到的第一位都是上一次发送的最后一位,这是为什么,波特率4800.
#include<reg52.h>
sbit LED0=P0^0;
int i=4,j,flag=0;
unsigned int T=0,temp=1,start=0;
unsigned char buf,d[5];
void init();
void main()
{
unsigned char a,b;
unsigned int c;
TMOD=0x20;//设定定时器1为工作方式2,8位自装填
TH1=0xf3;
TL1=0xf3;//4800
REN=1;
SM0=0;
SM1=1;//10位异步收发波特率计算公式波特率=(2^SMOD/32)*(T1溢出率)
EA=1;
ES=1;
TR1=1;
while(1)
{
if(start==1)
{
ES=0;
SBUF=d[0];
while(!TI);
TI=0;
SBUF=d[1];
while(!TI);
TI=0;
SBUF=d[2];
while(!TI);
TI=0;
SBUF=d[3];
while(!TI);
TI=0;
SBUF=d[4];
while(!TI);
TI=0;
ES=1;
for(c=T;c>0;c--)//T为脉冲个数
{
for(b=12;b>0;b--)
for(a=248;a>0;a--);
LED0=1; //延时一个机器周期
for(b=12;b>0;b--)
for(a=248;a>0;a--);
LED0=0; //延时一个机器周期
}
start=0;
T=0;
}
}
}
void UART(void) interrupt 4
{
buf=SBUF;
for(j=0;j<i;j++)
temp=temp*10;
T=T+((buf-48)*temp);
d[4-i]=buf;
i--;
temp=1;
if(i==-1)
{
i=4;
start=1;
}
RI = 0;
}
...全文
262 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
a091003040421 2014-07-17
  • 打赏
  • 举报
回复
引用 16 楼 zhujinqiang 的回复:
[quote=引用 11 楼 a091003040421 的回复:] 问题我发现了 在每次我发送字符之前单片机会自动产生一次串口通信 不知道为什么 难道上电后会自动开串口中断吗?
你 的51是啥厂家的,型号贴上来 是 STC的?[/quote]STC10F08XE
zhujinqiang 2013-09-11
  • 打赏
  • 举报
回复
引用 11 楼 a091003040421 的回复:
问题我发现了 在每次我发送字符之前单片机会自动产生一次串口通信 不知道为什么 难道上电后会自动开串口中断吗?
你 的51是啥厂家的,型号贴上来 是 STC的?
a091003040421 2013-09-10
  • 打赏
  • 举报
回复
引用 13 楼 f562158232 的回复:
应该是这句吧 buf=SBUF; 收到的是 空1234吗?
对 下次传送就是51234
初冬雪 2013-09-10
  • 打赏
  • 举报
回复
for(j=0;j<i;j++) 改为定长试一下,比如说for(j=0;j<8;j++)
Kwolve 2013-09-09
  • 打赏
  • 举报
回复
配置有问题吧。
觅食的猫猫 2013-09-09
  • 打赏
  • 举报
回复
应该是这句吧 buf=SBUF; 收到的是 空1234吗?
a091003040421 2013-09-09
  • 打赏
  • 举报
回复
问题我发现了 在每次我发送字符之前单片机会自动产生一次串口通信 不知道为什么 难道上电后会自动开串口中断吗?
a091003040421 2013-09-09
  • 打赏
  • 举报
回复
引用 9 楼 jimoxiaosage 的回复:
void UART(void) interrupt 4 { buf=SBUF; for(j=0;j<i;j++) i=4; j=0,1,2,3,? 是不是少了呢?
这个是算位数权值的 到个位不用计算直接乘1 所以是1234
千斤拨四两 2013-09-07
  • 打赏
  • 举报
回复
void UART(void) interrupt 4 { buf=SBUF; for(j=0;j<i;j++) i=4; j=0,1,2,3,? 是不是少了呢?
单片机工程师 2013-09-07
  • 打赏
  • 举报
回复
1、试着单步运行一下
TheMadMan 2013-09-06
  • 打赏
  • 举报
回复
两年没有搞单片机了,都忘了那些中断,串口的知识了。
a091003040421 2013-09-06
  • 打赏
  • 举报
回复
跑了好几遍也没发现什么问题愁死了
lr2131 2013-09-06
  • 打赏
  • 举报
回复
引用 2 楼 a091003040421 的回复:
引用 1 楼 lr2131 的回复:
代码的问题,缓冲区是怎么处理的,仔细看看。
你说的是电脑的缓冲区还是单片机的缓冲区?
当然是单片机的缓冲区
To_be_sky 2013-09-05
  • 打赏
  • 举报
回复
数据时对的,但是显示的不对,应该不是缓冲区没清的问题。 看了下你void UART(void) interrupt 4这个函数。 第一次就少了一个数据,应该就是这里的处理错了 条件不对。
lr2131 2013-09-04
  • 打赏
  • 举报
回复
代码的问题,缓冲区是怎么处理的,仔细看看。
a091003040421 2013-09-04
  • 打赏
  • 举报
回复
引用 1 楼 lr2131 的回复:
代码的问题,缓冲区是怎么处理的,仔细看看。
你说的是电脑的缓冲区还是单片机的缓冲区?

27,375

社区成员

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

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