新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 串口多機(jī)通訊的理解

串口多機(jī)通訊的理解

作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
串口的工作模式2,3中是屬于多機(jī)通信模式,以模式3為例;

模式3,是9位數(shù)據(jù)異步通信模式(加起始,停止11位),第9位位可編程位,(RB8,TB8).比特率可變

本文引用地址:http://butianyuan.cn/article/201611/322084.htm

在模式3中多了一位SM2控制位;

原理:在通訊模式2,3中,發(fā)射端設(shè)置TB8的狀態(tài)區(qū)別發(fā)送的是地址還是數(shù)據(jù),1(地址),0(數(shù)據(jù))。接收端通過RB8的接受進(jìn)行識(shí)別,當(dāng)SM2=1時(shí),若接收到RB8=1,則確認(rèn)主機(jī)發(fā)送的是地址幀,數(shù)據(jù)會(huì)進(jìn)入SBUF區(qū),并置為RI,會(huì)產(chǎn)生中斷,若接受的是RB8=0,則為數(shù)據(jù)幀,將不予理睬,舍棄。當(dāng)SM2=1時(shí),不管接受到的RB8為0或者1,都會(huì)存入SBUF中,產(chǎn)生中斷,故利于用此原理可以多機(jī)通訊;

工作過程如下:

1、將從機(jī)SM2置為1,處于只接受地址幀的狀態(tài);

2、主機(jī)發(fā)送地址幀,將TB8設(shè)為位1,表示發(fā)送的是地址;

3、所有的從機(jī)接受的地址幀后,將接受的數(shù)據(jù)與本機(jī)的地址對(duì)比,相等,則為尋址從機(jī),將SM2設(shè)為0,接受從機(jī)發(fā)來的數(shù)據(jù),直到接受完主機(jī)發(fā)來的所有數(shù)據(jù),判斷是否數(shù)據(jù)發(fā)送完,完了將SM2設(shè)為1;

4、主機(jī)在發(fā)完地址之后,會(huì)發(fā)送一組數(shù)據(jù)(將TB8設(shè)為0),表示發(fā)送的是數(shù)據(jù);

5、主機(jī)發(fā)完一組數(shù)據(jù)后,再發(fā)新的地址,重復(fù)上述步驟;

程序?qū)嵗?/p>

1、主機(jī)程序

#include"reg51.h"

//初始化串口設(shè)置

void init(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xd0; //設(shè)置工作模式3,1101,0000,SM0=1,SM1=1;(工作模式3)REN=1(允許接受標(biāo)志)
}

//主機(jī)發(fā)送信息函數(shù),,簡(jiǎn)單模擬

void send(uchar addr,uchar dat[])
{ uchar i;

TB8=1;
SBUF=addr;//發(fā)送地址信息
while(TI==0)
{
;
}
TI=0;

while(RI==0)//等待從機(jī)回應(yīng)
{
;
}
data1=SBUF;
RI=0;
if(data1!=addr)/ /是否與發(fā)送地址一致,不一樣則重發(fā)
{
flag2=0;

}
else{//一致則發(fā)送一組數(shù)據(jù)
TB8=0;//tb8設(shè)為0,發(fā)數(shù)據(jù)

for(i=0;i<4;i++)//發(fā)送數(shù)據(jù)塊

{
SBUF=dat[i];

while(TI==0)
{
;
}
TI=0;

}
void main()

{

init();

while(1)

{

send(addr,dat[]);

}

}

從機(jī)部分

#define addr 0xxx;主機(jī)地址

void init(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SCON=0Xd0;
}

void receive(void)
{
SM2=1;
while(RI==0)
{
;
}
data1=SBUF;
RI=0;
if(data1!=addr)//不是,則舍棄 返回主函數(shù),等待下次的呼喚
{


}
else {//是呼喚的本機(jī),對(duì)主機(jī)返回地址
TI=0;
TB8=1;//表示發(fā)出的是地址
SM2=0;
key2=1;
SBUF=addr;
while(TI==0)
{
;
}
TI=0;
TB8=0;

for(i=0;i<4;i++)

{

While(!RI);

R1=0;

dat[i]=sbuff;

}

SM2=1;//接受完數(shù)據(jù)將SM2設(shè)為1

}

}



關(guān)鍵詞: 串口多機(jī)通

評(píng)論


技術(shù)專區(qū)

關(guān)閉