单片机与PC机相联的串口通信协议

[复制链接]
 楼主| 小小猫咪 发表于 2013-6-18 19:41 | 显示全部楼层 |阅读模式
我写了一段单片机与PC机相联的串口通信协议,先PC机向单片机发一个数据,然后单片机再把这个数据发给PC机,一开始我是这样写的:
#include <reg52.h>
unsigned char a,flag;
void main()
{
SM0=0;
SM1=1;
REN=1;
TMOD=0X20; //8位自动重装
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
flag=0;
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
if(TI==1)
{
TI=0;
ES=1;
}

}
}
}

void serial()interrupt 4
{
RI=0;
P1=SBUF;
a=SBUF;
flag=1;
}

这个程序的结果PC机只能发一次,也只能收到一次,再发就收不到了,然后我改了一下程序:
#include <reg52.h>
unsigned char a,flag;
void main()
{
SM0=0;
SM1=1;
REN=1;
TMOD=0X20; //8位自动重装
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
flag=0;
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(!TI);
TI=0;
ES=1;

}
}
}

void serial()interrupt 4
{
RI=0;
P1=SBUF;
a=SBUF;
flag=1;
}


这个程序的结果是PC机与单片机收发正常。两个程序唯一的不同就是在字体比较大的那个地方不同,可是第一个程序好像也没错呀,可为什么只能收发一次呢??
请各位大侠支招,
kangzj 发表于 2013-6-18 19:42 | 显示全部楼层
while是死等,if是死等么?
houcs 发表于 2013-6-18 19:43 | 显示全部楼层
用中断处理比较好
liuzaiy 发表于 2013-6-18 19:43 | 显示全部楼层
要是while和if一样 何苦搞两个关键字呢
yinxiangh 发表于 2013-6-18 19:44 | 显示全部楼层
ES=0;
   flag=0;
   SBUF=a;
执行的次数不一样。
pangb 发表于 2013-6-18 19:44 | 显示全部楼层
SBUF=a;//这里已经把数据发送出去
    if(TI==1)//接下来马上执行这条判断,结果TI是为0,那么中断没打开,重新循环,结果flag永远为0
   {            
    TI=0;
    ES=1;
    }
chenjunt 发表于 2013-6-18 19:45 | 显示全部楼层
中断没有设置好,而导致首发只能成功一次
ousj 发表于 2013-6-18 19:45 | 显示全部楼层
正解!
 楼主| 小小猫咪 发表于 2013-6-18 19:46 | 显示全部楼层
哦,我知道了, 多谢啊
 楼主| 小小猫咪 发表于 2013-6-18 19:49 | 显示全部楼层
那就结贴了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

313

主题

3014

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部

313

主题

3014

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部