0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

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

#include
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的数据传送,但是用串口调试助手的时候,向单片机发送命令,单片机可以收到,但是在串口调试助手的接受区,收不到单片机发回来的命令。请高手解答
提问者:60user11 地点:- 浏览次数:4294 提问时间:12-07 21:10
我有更好的答案
提 交
7条回答
hu_wflllllllg21 12-12 23:17
...................
SBUF=a;
while(!TI);//等待发送完成,发送完成以后状态才为1,
TI=0;
..........

改了以后,只有PC接收到回传数据以后才能发第二个字节;
否则将丢失数据。
yzrui 12-11 06:42
SBUF=a;
while(TI==1)
TI=0;
改为
SBUF=a;
while(TI==0)
{
      ;
}
TI=0;

但这种程序结构还是太烂了,建议搞好一点。
wangrubing 12-15 11:53
把串口接收中断服务程序改为如下代码试试看:

void ser() interrupt 4    //中断方式
{
  unsigned char reChar;
  
  RI=0;
  reChar = SBUF;
  P0=reChar;
  a=reChar;
  flag=1;
}
芯羿飞扬 12-09 00:15
有没有TEN的设定位啊?
musicalboy 12-11 09:28
没有TEN的设定位啊!
drakannie 12-10 00:25
关键的错字,看的我头晕“收不到”,“接收区”。
我又看了一遍程序,不知是否是5L改的问题,否则:
1、复位后,单片机接收缓冲区数据没有赋值,为0xff正常;
2、如果硬件没有问题(包括接线),肯定能接收到第一个数据;
3、如果能够接收到第一个数据:则是你自己的失误,注意"while(TI)TI=0;"与"while(TI);TI=0;"的区别;应该是你写成"while(TI)TI=0;";死在这了,这里中断已经关了;
4、简单改了一下你的程序结构:
..............................
main()
{
inter();
    while(1)

}
冬冬5241 12-12 18:45
晕,点错了,继续:
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;}
}
.......................
参考一下。
撰写答案
提 交
1 / 3
1 / 3