久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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

串口多機通訊的理解

作者: 時間:2016-11-27 來源:網絡 收藏
串口的工作模式2,3中是屬于多機通信模式,以模式3為例;

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

本文引用地址:http://cqxgywz.com/article/201611/322084.htm

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

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

工作過程如下:

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

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

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

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

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

程序實例:

1、主機程序

#include"reg51.h"

//初始化串口設置

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

//主機發(fā)送信息函數,,簡單模擬

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

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

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

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

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

{
SBUF=dat[i];

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

}
void main()

{

init();

while(1)

{

send(addr,dat[]);

}

}

從機部分

#define addr 0xxx;主機地址

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)//不是,則舍棄 返回主函數,等待下次的呼喚
{


}
else {//是呼喚的本機,對主機返回地址
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;//接受完數據將SM2設為1

}

}



關鍵詞: 串口多機通

評論


技術專區(qū)

關閉