打印

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

[复制链接]
1661|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

使用特权

评论回复
5
xmar| | 2012-3-12 12:01 | 只看该作者
把串口接收中断服务程序改为如下代码试试看:

void ser() interrupt 4    //中断方式
{
  unsigned char reChar;
  
  RI=0;
  reChar = SBUF;
  P0=reChar;
  a=reChar;
  flag=1;
}

使用特权

评论回复
6
wzf3151| | 2012-3-12 12:17 | 只看该作者
有没有TEN的设定位啊?

使用特权

评论回复
7
xmar| | 2012-3-12 12:30 | 只看该作者
没有TEN的设定位啊!

使用特权

评论回复
8
wzf3151| | 2012-3-12 13:17 | 只看该作者
跟踪一下啊

使用特权

评论回复
9
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)

}

使用特权

评论回复
10
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;}
}
.......................
参考一下。

使用特权

评论回复
11
枫恋00|  楼主 | 2012-3-13 21:48 | 只看该作者
10# g1234567 好的,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

60

帖子

0

粉丝