微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 串口每次多返回一个字符,求解

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

时间:10-02 整理:3721RD 点击:
一个很基本的串口程序
功能:给单片机发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]!='\0')  //为什么用这种方式会多返回一个字符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++;
}
}

  i=0;
while(temp[i]!='\0')  //为什么用这种方式会多返回一个字符5,结束符?
{     
   SBUF=temp[i];
   while(!TI);
    TI=0;
    i++;   
   }  
把以上程序,改成一下是正确的
                           for(i=0;i<6;i++)
                        {
                                SBUF=temp[i];
                                while(!TI);
                                TI=0;
                        }

那个flag应该等于5

你这个就是在接收的时候加了一个缓冲,每收到6个再发送出去。
while(temp[i]!='\0') 这句话的意思把temp当成一个字符串,你可以在初始化的时候temp[6] = {0};试下。
当然最好的办法还是不用while,因为你知道有几个数字,直接用for就可以。

我试过这样定义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!='\0')
{
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!='\0')  //为什么用这种方式会多返回一个字符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++;
}
}

我等下取试试

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top