51串口发送的数据是FF,返回来的却是FE,一直弄不明白怎么回事?

#include<reg52.h>#define uchar unsigned charuchar table[3]={0};uchar word[]="I get";uchar i,j,num;bit flag; //判断数据是否接收完毕变量void Com_Init(void);void main(void) //主函数{ Com_Init(); //初始化 while(1) //发送函数 { if(flag==1) //接收完成开始发送 { ES = 0; for(i=0;i<6;i++) //循环发送 I get { SBUF = word[i]; while(!TI); TI = 0; } for(j=0;j<4;j++) //循环发送接收的数据 { SBUF = table[j]; while(!TI); TI = 0; } j=0; i=0; ES=1; flag=0; } } /*if(flag==1) //进来后立即关掉中断 { ES=0; flag=0; SBUF=P1; while(!TI) TI=0; ES=1; } */} void serial(void) interrupt 4 //接收中断函数{ RI = 0; table[num++] =SBUF; if(num==3) //判断是否接收到两字节数据 flag = 1;}void Com_Init(void) //串口设置及初始化{ TMOD = 0x20; //定时器1工作方式2 PCON = 0x00; //串口单倍率 SCON = 0x50; //串口工作在方式1 TH1 = 0xFa; //设置波特率 9600 TL1 = 0xFa; TR1 = 1; //启动定时器1 ES = 1; //开串口中断 EA = 1; //开总中断 num = 0; flag = 0; }这个程序想用来接收串口输入的字符串的亲,用串口调试助手发送16进制FF,返回来的却是FE,一直不知道怎么回事?
2026年09月21日 17:22
有1个网友回答
网友(1):

‍1.收到FE应该是波特率的问题,按你原来T1的溢出率计算,你用的晶振应该是28.8MHZ。如果用11.0592MHZ的晶振定时器初值应该为0xfd。
2.原来的程序修改如下(经测试无误,末尾有说明):
#include
#define uchar unsigned char
uchar table[2]={0};                                                         //两个字节应该为2
uchar word[]="I get";
uchar i,j,num;
bit flag;    //????????????
void Com_Init(void);

void main(void)      //???
{
  Com_Init();         //???
  while(1)         //????
 {
   if(flag==1)   //????????
   {
   ES = 0;
   for(i=0;i<6;i++)    //???? I get
   {
   SBUF = word[i];
   while(!TI);
   TI = 0;
   }
   for(j=0;j<2;j++)   //?????????                                      //4改成2,两个字节
   {
   SBUF = table[j];
   while(!TI);
   TI = 0;
   }
   j=0;
   i=0;
   ES=1;
   flag=0;
   }
   }
   
   /*if(flag==1)  //?????????
    {
     ES=0;
    flag=0;
     SBUF=P1;
     while(!TI)
     TI=0;
     ES=1;
     } */
}

void serial(void) interrupt 4      //??????
{  
   RI = 0;
   table[num] =SBUF;
   num++;                                                                    //建议把num++放到外边
   if(num==2)    //????????????                                     //存储2个字节
     {
            num=0;                                                            //原程序未清零
            flag = 1;
     }
}

void Com_Init(void)     //????????
{
     TMOD = 0x20;      //???1????2
     PCON = 0x00;     //?????
     SCON = 0x50;     //???????1        
     TH1 = 0xFd;    //????? 9600                                 //11.0592MHZ晶振应设置为0xfd

     TL1 = 0xFd;
     TR1 = 1;        //?????1
    ES = 1;        //?????
    EA = 1;        //????    
    num = 0;
    flag = 0;
         
}
—————————————————————分割线————————————————————————
说明:
1)程序按原程序备注“//判断是否接收到两字节数据”进行修改。功能为接收两个字节数据后再发送回去;
2)修改的地方在备注进行了说明。原程序备注我复制后都成了“???”;

3)因为发送的第一个字符串“I get”为ASCII码,所以“串口调试助手”应以ASCII码的形式显示其接收到的数据。此时若发送FF,则没有对应的ASCII码字符,所以测试时发送的是十六进制数“41 42”,对应ASCII码“AB”。

4)串口调试助手测试结果: