多机通信的问题,,
时间:10-02
整理:3721RD
点击:
程序主要是从机发送数据,主机接收并显示,2从1主。可是,数据接收会不正常,请了解的TX帮忙看下原因,谢谢了。
/********主机程序*********/
void main()
{
SCON=0xd0; //主机模式3 SM2=0, REN=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd; //9600bit/s
TL1=0xfd;
TR1=1;
TI=0;
RI=0;
initiallcd(); //1602初始化
disponechar(12,0,a[0]);
disponechar(13,0,a[1]);
disponechar(14,0,a[2]);
disponechar(15,0,a[3]);
disponechar(12,1,a[5]);
disponechar(13,1,a[6]);
disponechar(14,1,a[7]);
disponechar(15,1,a[8]);
addr=0x01;
while(1)
{
uchar a,j;
while(a!=addr)
{
TI=0;
TB8=1;
SBUF=addr;
while(!TI);
TI=0;
delay(20);
while(!RI);
a=SBUF;
RI=0;
}
switch(addr)
{
case 0x01:
for(j=0;j<2;j++)
{
while(!RI);
buff[j]=SBUF;
RI=0;
temp1=buff[0]+buff[1];
}
disponechar(0,0,wendu[temp1%100/10]);
disponechar(1,0,wendu[temp1%10]);
break;
case 0x02:
while(!RI);
temp2=SBUF;
RI=0;
disponechar(0,1,wendu[temp2%100/10]);
disponechar(1,1,wendu[temp2%10]);
break;
}
addr++;
if(addr==0x03)
{
addr=0x01;
}
}
}
/********从机1程序*********/
void main()
{
SCON=0xd0; //主机模式3 SM2=0, REN=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd; //9600bit/s
TL1=0xfd;
TH0=0x00; //9600bit/s
TL0=0x00;
TR1=1;
TI=0;
RI=0;
while(1)
{
uchar a,i;
SM2=1;
while(a!=addr) //addr=0x01;
{
while(!RI);
a=SBUF;
RI=0;
}
TI=0;
TB8=0;
SBUF=addr;
while(!TI);
TI=0;
SM2=0;
delay(20);
for(i=0;i<2;i++)
{
SBUF=buff[i];
while(!TI);
TI=0;
}
SM2=1;
}
}
/********从机2程序*********/
void main()
{
SCON=0xd0; //主机模式3 SM2=0, REN=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd; //9600bit/s
TL1=0xfd;
TR1=1;
TI=0;
RI=0;
while(1)
{
uchar a;
SM2=1;
while(a!=addr) //addr=0x02;
{
while(!RI);
a=SBUF;
RI=0;
}
TI=0;
TB8=0;
SBUF=addr;
while(!TI);
TI=0;
SM2=0;
delay(20);
SBUF=temp1;
while(!TI);
TI=0;
temp1=temp1+2;
delay(200);delay(200);delay(200);
SM2=1;
}
}
/********主机程序*********/
void main()
{
SCON=0xd0; //主机模式3 SM2=0, REN=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd; //9600bit/s
TL1=0xfd;
TR1=1;
TI=0;
RI=0;
initiallcd(); //1602初始化
disponechar(12,0,a[0]);
disponechar(13,0,a[1]);
disponechar(14,0,a[2]);
disponechar(15,0,a[3]);
disponechar(12,1,a[5]);
disponechar(13,1,a[6]);
disponechar(14,1,a[7]);
disponechar(15,1,a[8]);
addr=0x01;
while(1)
{
uchar a,j;
while(a!=addr)
{
TI=0;
TB8=1;
SBUF=addr;
while(!TI);
TI=0;
delay(20);
while(!RI);
a=SBUF;
RI=0;
}
switch(addr)
{
case 0x01:
for(j=0;j<2;j++)
{
while(!RI);
buff[j]=SBUF;
RI=0;
temp1=buff[0]+buff[1];
}
disponechar(0,0,wendu[temp1%100/10]);
disponechar(1,0,wendu[temp1%10]);
break;
case 0x02:
while(!RI);
temp2=SBUF;
RI=0;
disponechar(0,1,wendu[temp2%100/10]);
disponechar(1,1,wendu[temp2%10]);
break;
}
addr++;
if(addr==0x03)
{
addr=0x01;
}
}
}
/********从机1程序*********/
void main()
{
SCON=0xd0; //主机模式3 SM2=0, REN=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd; //9600bit/s
TL1=0xfd;
TH0=0x00; //9600bit/s
TL0=0x00;
TR1=1;
TI=0;
RI=0;
while(1)
{
uchar a,i;
SM2=1;
while(a!=addr) //addr=0x01;
{
while(!RI);
a=SBUF;
RI=0;
}
TI=0;
TB8=0;
SBUF=addr;
while(!TI);
TI=0;
SM2=0;
delay(20);
for(i=0;i<2;i++)
{
SBUF=buff[i];
while(!TI);
TI=0;
}
SM2=1;
}
}
/********从机2程序*********/
void main()
{
SCON=0xd0; //主机模式3 SM2=0, REN=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd; //9600bit/s
TL1=0xfd;
TR1=1;
TI=0;
RI=0;
while(1)
{
uchar a;
SM2=1;
while(a!=addr) //addr=0x02;
{
while(!RI);
a=SBUF;
RI=0;
}
TI=0;
TB8=0;
SBUF=addr;
while(!TI);
TI=0;
SM2=0;
delay(20);
SBUF=temp1;
while(!TI);
TI=0;
temp1=temp1+2;
delay(200);delay(200);delay(200);
SM2=1;
}
}
用中断试试,就是串口中断,逻辑关系稍微简单点
把你通信部分的硬件电路贴上来看一下
电路图
麻烦各位高手指点一下~
最近在实验多机通信的程序的时候,发现如果主机和多个从机里面发送和接收的时序是一样的话,才能收发正常,假如某个从机有较长延时,比如0.5秒,那么就通信不了。所以我想问一下,多机通信是不是必须要保持主从机时序一致?如果时序不一致,有没有什么方法解决通信问题?谢谢了。
小编 在吗 我做的题目刚好和你一样 希望向你请教几个问题 QQ 592109366
坐等答案
小编 在吗 我做的题目和你类似 想请教你几个问题 这个是我qq592109366