单片机/MCU论坛
直播中

szlcw

13年用户 5经验值
擅长:基础元器件
私信 关注
[问答]

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

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

这是我的程序:

甲单片机:

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

void    delay(unsigned int m)            //延时程序
{
    unsigned int i,j;
    for(i=0; 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
#define uchar unsigned char
#define uint unsigned int
***it 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         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

2014-4-23 11:25:42
甲一直发送数据,而乙接收到数据后就发送个反馈信息给甲。
-------------------
甲不能一直处于发送状态,应该是发送完成后立即进入接收状态才能及时收到乙方反馈的信息
举报

z00

2014-4-23 11:26:18
单片机间的串口通信方式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. }
举报

陈锐文

2014-4-24 14:40:58
有一个问题,就是你主函数和中断函数都调用了校验这个函数。有可能产生混乱。你可以先试一下用方式1。看看有没问题再用方式2。
举报

331933

2014-4-26 14:39:43
这个。。。。是不是不该在中断函数中,调用奇偶校验的运算?在中断函数中,应该尽可能做少的事吧?
if(RB8==jiaoyan(temp)) 这句话改掉试试看
举报

331933

2014-4-26 14:48:24
我去!!这贴是2011年发的啊???!!!
举报

youzizhile

2014-4-26 19:11:39
while(jieshou!=0x60);
while(jieshou==0x60)。。。
while(1);
这几个while循环一旦退出后就不会在进入了,可以在检查下编程和测试流程
举报

松菇

2015-12-9 22:41:21
。。。。。。
举报

1103533351

2015-12-10 08:01:25

这个。。。。是不是不该在中断函数中,调用奇偶校验的运算?在中断函数中,应该尽可能做少的事吧?
if(RB8==jiaoyan(temp)) 这句话改掉试试看
举报

h1654155960.8359

2017-2-21 16:05:31
不错的文档,很受用
举报

让我

2017-9-20 16:03:47
好在艰难慢了无数倍
举报

更多回帖

发帖
×
20
完善资料,
赚取积分