单片机串口通信带奇偶校验的问题

2019-07-16 07:07发布

为什么我用两个单片机做实验,一个很简单的程序,让甲发送信息(0x60)给乙,在没收到乙的反馈信息(0x50)前,甲一直发送数据,而乙接收到数据后就发送个反馈信息给甲。为什么乙每次都能收到甲的信息,但乙的反馈信息却传不回甲处?极少数情况能传回甲处。
单片机串口通信
另外,不知我的奇校验子程序是否有问题呢?能提供个串口通信带奇偶校验例程吗?!

这是我的程序:

甲单片机:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit start=P0^0;//发光二极管,用来检测数据是否在发送
unsigned char a=0xff,i=100,b,jieshou;

void    delay(unsigned int m)            //延时程序
{
    unsigned int i,j;
    for(i=0; i<m; i++)
        for(j=0; j<110; j++);
}

     


bit jiaoyan(uchar m)//奇校验
{
int i;
bit tmp;
for(i=0;i<8;i++)
{
  tmp=tmp^m&0x01;
  m>>=1;
}
tmp=~tmp;
return tmp;
}
void main()
{
SCON=0xd0;//串口通信方式3
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;//开计数器
EA=1;
ES=1;//开串口中断
ti=0;
RI=0;
while(jieshou!=0x50)
{
  TB8=jiaoyan(0x60);
  SBUF=0x60;
  delay(1100);
  start=0;
  delay(1100);
  start=1;

}
start=0;
while(1);




}

void ser0() interrupt 4//串口中断
{
uchar temp;
ES=0;
if(TI==1)
{ TI=0;
  }
if(RI==1)
{
  temp=SBUF;
  if(RB8==jiaoyan(temp))
  {
   jieshou=temp;
  }
//  else
//   {jieshou=0xff;}
  RI=0;
}
ES=1;
}



乙单片机:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit start=P0^0;//发光二极管,用来检测数据是否在发送
unsigned char a=0xff,i=100,b,jieshou,xh=1;

void    delay(unsigned int m)            //延时程序
{
    unsigned int i,j;
    for(i=0; i<m; i++)
        for(j=0; j<110; j++);
}

     


bit jiaoyan(uchar m)//奇校验
{
int i;
bit tmp;
for(i=0;i<8;i++)
{
  tmp=tmp^m&0x01;
  m>>=1;
}
tmp=~tmp;
return tmp;
}
void main()
{
SCON=0xd0;//串口通信方式3
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;//开计数器
EA=1;
ES=1;//开串口中断
TI=0;
RI=0;
while(jieshou!=0x60);
while(jieshou==0x60)(这个语句总是判断不到,当接收到甲的信号后,就直接跳到下一个语句停在while(1);处了,而不是进行循环发送,而我如果改成while(i--);就能进行循环,但要在发送几十次后才能成功让甲单片机收到信号)
{
  TB8=jiaoyan(0x50);
  SBUF=0x50;
  start=0;
  delay(2200);
  start=1;
  delay(1100);

}
start=0;
while(1);



}

void ser0() interrupt 4//串口中断
{
uchar temp;
ES=0;
if(TI==1)
{ TI=0;
  }
if(RI==1)
{
  temp=SBUF;
  if(RB8==jiaoyan(temp))
  {
   jieshou=temp;
  }
//  else
//   {jieshou=0xff;}
  RI=0;
}
ES=1;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
z00
1楼-- · 2019-07-16 09:50
 精彩回答 2  元偷偷看……
z00
2楼-- · 2019-07-16 10:05
单片机间的串口通信方式3带奇偶校验的通信:

  1. bit jiaoyan(uchar m)//奇校验
  2. {
  3. int i;
  4. bit tmp;
  5. for(i=0;i<8;i++)
  6. {
  7. tmp=tmp^m&0x01;
  8. m>>=1;
  9. }
  10. tmp=~tmp;
  11. return tmp;
  12. }

  13. for(i=0;i<16;i++) //使其一次发送 15个数据
  14. {
  15. while (!TI0);        // 等待发送1个字节数据完成
  16. TI0=0; // 清除中断标志
  17. ACC=T_Sbuf[i]; // 发送数据到ACC
  18. ACC +=Zero;
  19. TB80=P; //奇效验
  20. SBUF0=T_Sbuf[i]; // 发送数据到uart0
  21. }
复制代码
依然落叶飘零
3楼-- · 2019-07-16 14:30
有一个问题,就是你主函数和中断函数都调用了校验这个函数。有可能产生混乱。你可以先试一下用方式1。看看有没问题再用方式2。
yumourende
4楼-- · 2019-07-16 17:19
这个。。。。是不是不该在中断函数中,调用奇偶校验的运算?在中断函数中,应该尽可能做少的事吧?
if(RB8==jiaoyan(temp)) 这句话改掉试试看

评分

参与人数 1积分 +10 收起 理由 zhou2sheng + 10 感谢您的参与,您的支持是我们最大的动力.

查看全部评分

yumourende
5楼-- · 2019-07-16 18:47
我去!!这贴是2011年发的啊???!!!
youzizhile
6楼-- · 2019-07-16 23:30
 精彩回答 2  元偷偷看……

一周热门 更多>