新聞中心

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

        串口多機通訊的理解

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

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

        本文引用地址:http://www.104case.com/article/201611/322084.htm

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

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

        工作過程如下:

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

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

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

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

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

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

        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ā)送信息函數(shù),,簡單模擬

        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ā)送一組數(shù)據(jù)
        TB8=0;//tb8設為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[]);

        }

        }

        從機部分

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


        }
        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;//接受完數(shù)據(jù)將SM2設為1

        }

        }



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

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 马关县| 拜泉县| 拉孜县| 岳池县| 枣庄市| 贵南县| 亚东县| 灌云县| 高清| 佛山市| 石棉县| 贵南县| 沧州市| 卓资县| 苏尼特右旗| 阿拉尔市| 墨脱县| 宾川县| 湟中县| 揭东县| 周口市| 汪清县| 西丰县| 乐都县| 临沭县| 静海县| 合山市| 柳河县| 成都市| 淮北市| 囊谦县| 邵武市| 额敏县| 信丰县| 岑巩县| 清苑县| 区。| 久治县| 来凤县| 尼勒克县| 云阳县|