串口每次多返回一个字符,求解

2019-07-15 22:51发布

一个很基本的串口程序
功能:给单片机发6个字符,然后让它返回这6个字符
出现2个问题‘
1,第一次用串口发送时,只返回4个字符(也许与程序没关系)
2,每次返回的字符多了另一个。如发送123456,却返回的是1234565

程序如下,希望大家能帮忙 ,谢谢

#include <reg52.h>     
#define uchar unsigned char
#define uint unsigned int
unsigned char flag=0,i;
uchar  temp[6];
uchar  num=0 ;
int j ;
void init()            //串口初始化
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{  
  if(flag==6)      //收到6个字符后,执行
  {
      ES=0;        //关中断,既发送时不计入中断
   i=0;
while(temp[i]!='')  //为什么用这种方式会多返回一个字符5,结束符?
{     
   SBUF=temp[i];
   while(!ti);
    TI=0;
    i++;   
   }  
      ES=1;
   flag=0;
  }  
}
}
void ser() interrupt 4      
{
if(RI)     //只有当接收时,才执行以下程序★★★★★
{
RI=0;  
temp[flag]=SBUF; //接受到的字符存到数组中
flag++;
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
yici1988
1楼-- · 2019-07-16 04:42
  i=0;
while(temp[i]!='')  //为什么用这种方式会多返回一个字符5,结束符?
{     
   SBUF=temp[i];
   while(!TI);
    TI=0;
    i++;   
   }  
把以上程序,改成一下是正确的

                           for(i=0;i<6;i++)
                        {
                                SBUF=temp[i];
                                while(!TI);
                                TI=0;
                        }
madboy
2楼-- · 2019-07-16 09:02
 精彩回答 2  元偷偷看……
xunfeng0862
3楼-- · 2019-07-16 12:51
你这个就是在接收的时候加了一个缓冲,每收到6个再发送出去。
while(temp[i]!='') 这句话的意思把temp当成一个字符串,你可以在初始化的时候temp[6] = {0};试下。
当然最好的办法还是不用while,因为你知道有几个数字,直接用for就可以。

yici1988
4楼-- · 2019-07-16 13:31
xunfeng0862 发表于 2013-8-23 15:56
你这个就是在接收的时候加了一个缓冲,每收到6个再发送出去。
while(temp!='') 这句话的意思把temp当成一 ...

我试过这样定义temp[]={‘0’,‘0’,‘0’,‘0’,‘0’,‘0’} 还是不行,但是其他的数组我可以用这个方式 ,我把下面table[]数组也用这种方式,返回的是I get 没有错误啊


#include <reg52.h>     
#define uchar unsigned char
#define uint unsigned int
unsigned char flag=0,a,i,b,c,d,e,f,g;
uchar code table[]="I get ";
uchar  temp[6];
uchar  num=0 ;
int j ;
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{  
  if(flag==6)
  {
      ES=0;
//   for(i=0;i<6;i++)
//   {
//    SBUF=table;
//    while(!TI);
//    TI=0;
//   }
while(table!='')
{
SBUF=temp;
while(!TI);
TI=0;
}
      i=0;
      for(i=0;i<6;i++)
    {
      SBUF=temp;
      while(!TI);
      TI=0;
      i++;
    }
//
//    i=0;
//  while(temp!='')  //为什么用这种方式会多返回一个字符5,结束符?
//   {     
//    SBUF=temp;
//    while(!TI);
//    TI=0;
//    i++;   
//   }  
      ES=1;
   flag=0;
  }  
}
}
void ser() interrupt 4      
{
if(RI)     //只有当接收时,才执行以下程序★★★★★
{
RI=0;  
// if(flag==temp1[flag])
// {  
temp[flag]=SBUF;
// }
flag++;
}
}

yici1988
5楼-- · 2019-07-16 15:39
madboy 发表于 2013-8-23 10:33
那个flag应该等于5

我等下取试试

一周热门 更多>