请高手帮忙解答一下串口程序的问题

[复制链接]
2474|10
 楼主| 枫恋00 发表于 2012-3-10 21:44 | 显示全部楼层 |阅读模式
#include<reg52.h>
unsigned char flag,a;
void inter();
void main()
{
  inter();

    while(1)
{
  if(flag==1)
   {
ES=0; //关闭中断
flag=0;
SBUF=a;
while(TI==1)

TI=0;
ES=1;

   }
}
}
void ser() interrupt 4    //中断方式
{

RI=0;
P0=SBUF;
a=SBUF;
flag=1;

}
void inter()
{   
   TMOD=0x20;
   TH1=0xfd;
   TL1=0xfd;
   TR1=1;  //启动t1
   REN=1;  //允许串行接收
   SM0=0; //设定串行工作方式
   SM1=1;
   EA=1;
   ES=1;
}

这是我写的一个串口的程序,有点问题一直找不出来。这是实现单片机和pc的数据传送,但是用串口调试助手的时候,向单片机发送命令,单片机可以收到,但是在串口调试助手的接受区,收不到单片机发回来的命令。请高手解答
g1234567 发表于 2012-3-10 22:15 | 显示全部楼层
...................
SBUF=a;
while(!TI);//等待发送完成,发送完成以后状态才为1,
TI=0;
..........

改了以后,只有PC接收到回传数据以后才能发第二个字节;
否则将丢失数据。
mohanwei 发表于 2012-3-10 22:16 | 显示全部楼层
SBUF=a;
while(TI==1)
TI=0;
改为
SBUF=a;
while(TI==0)
{
      ;
}
TI=0;

但这种程序结构还是太烂了,建议搞好一点。
 楼主| 枫恋00 发表于 2012-3-11 20:13 | 显示全部楼层
2# g1234567 不行啊,试过了,而且在向单片机发数据的时候也受不到,然后每次单片机复位后,在接收去都是显示ff
xmar 发表于 2012-3-12 12:01 | 显示全部楼层
把串口接收中断服务程序改为如下代码试试看:

void ser() interrupt 4    //中断方式
{
  unsigned char reChar;
  
  RI=0;
  reChar = SBUF;
  P0=reChar;
  a=reChar;
  flag=1;
}
wzf3151 发表于 2012-3-12 12:17 | 显示全部楼层
有没有TEN的设定位啊?
xmar 发表于 2012-3-12 12:30 | 显示全部楼层
没有TEN的设定位啊!
wzf3151 发表于 2012-3-12 13:17 | 显示全部楼层
跟踪一下啊
g1234567 发表于 2012-3-12 18:55 | 显示全部楼层
关键的错字,看的我头晕“收不到”,“接收区”。
我又看了一遍程序,不知是否是5L改的问题,否则:
1、复位后,单片机接收缓冲区数据没有赋值,为0xff正常;
2、如果硬件没有问题(包括接线),肯定能接收到第一个数据;
3、如果能够接收到第一个数据:则是你自己的失误,注意"while(TI)TI=0;"与"while(TI);TI=0;"的区别;应该是你写成"while(TI)TI=0;";死在这了,这里中断已经关了;
4、简单改了一下你的程序结构:
..............................
main()
{
inter();
    while(1)

}
g1234567 发表于 2012-3-12 19:06 | 显示全部楼层
晕,点错了,继续:
1)
...............
main()
{
     inter();
     while(1)
     {
         if(flag==1)
        {
           flag=0;
           SBUF=a;
        }
    }
}
void ser() interrupt 4    //中断方式
{
    if(RI)
    {
          a=SBUF;
          P0=SBUF;
           RI=0;
         flag=1
     }
    IF(TI){TI=0;}
}
.....................
2)
.............
main()
{
    inter();
    while(1);
}
void ser() interrupt 4    //中断方式
{
    if(RI)
    {
          a=SBUF;
          P0=SBUF;
          SBUF=a;
          RI=0;
     }
    IF(TI){TI=0;}
}
.......................
参考一下。
 楼主| 枫恋00 发表于 2012-3-13 21:48 | 显示全部楼层
10# g1234567 好的,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

60

帖子

0

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