以太網(wǎng)多機(jī)通訊與一對一通信的最大差異就是,前者需要多傳輸一個地址碼。一對一通信時,主機(jī)發(fā)送數(shù)據(jù)后叢集接收,而叢集發(fā)送數(shù)據(jù)是就換成主機(jī)接收,無需地址碼。但是當(dāng)一個主機(jī)與多個從機(jī)通信時,主機(jī)發(fā)出的信息如何正確的傳輸?shù)侥硞€從機(jī)呢?必須有地址嗎?
針對這個問題,在多計系統(tǒng)中,每一個從機(jī)都有其特定的編號(也有人稱為地址或者ID)。在傳輸數(shù)據(jù)前,各個從機(jī)都處于待機(jī)接受的狀態(tài)。當(dāng)主機(jī)指定到某個特定的從機(jī)時,該從機(jī)才開始接收或發(fā)送數(shù)據(jù),而這項指定特定地址從機(jī)的操作,實際上就是送出地址碼。每個從機(jī)的串口都會收到主機(jī)發(fā)出的地址碼,然后程序會先判斷一下是否與自己的地址相同,若相同則開始啟動執(zhí)行程序。
在多機(jī)通訊中我們一直提到地址碼,那么在串行通信時,如何去辨別地址值(Address)和數(shù)據(jù)(Data)呢?這正是MCS-51串行模式2和模式3的魅力所在。當(dāng)MCS-51工作在以上兩個模式時,除了數(shù)據(jù)占8位,傳輸時多了一個TB8位,接收時則多了一個RB8位。在多機(jī)通信時,當(dāng)TB8=1代表證傳輸一個地址碼,該地址碼有8位寬,所以理論上講,在同一個系統(tǒng)中可以連接28=256個從機(jī)。TB=0代表正在傳輸一個數(shù)據(jù)值,在此串行傳輸線上,每次串行數(shù)據(jù)共有11個位,但其中以第10個位的狀態(tài)來區(qū)分地址或數(shù)據(jù),接收端可以依次格式立刻判斷出其中的差異來。
在從機(jī)中,通常以串口中斷的方式來對待進(jìn)來的數(shù)據(jù),若把SCON寄存器的SM2位設(shè)置成為1時,即允許MCS-51的串行接口進(jìn)行多從機(jī)的地址判斷,在這個模式下,從機(jī)只在接收地址值(其RB8=1)時才產(chǎn)生中斷請求。
在串行中斷的服務(wù)程序上,只要由SBUF內(nèi)讀回地址值,就做一個判斷是否被調(diào)用。若為YES時則跳去執(zhí)行程序設(shè)置的操作,若為NO時則不作任何操作,隨即結(jié)束此中斷服務(wù)程序并返回主程序,特定的從機(jī)先設(shè)置成SM2,然后開始發(fā)送或者接收數(shù)據(jù),而其他的從機(jī)并未啟動傳輸,所以在此瞬間仍然是一對一通信,當(dāng)主機(jī)在最初的發(fā)送地址階段卻是一對多的通信。
單片機(jī)的串口是TTL電平的,也就是0-5V,傳輸距離最遠(yuǎn)只有5m。如果想要遠(yuǎn)距離傳輸,還應(yīng)將TTL電平轉(zhuǎn)換為RS485電平。MCS-51的多機(jī)通信協(xié)議未必適合于其他種類的單片機(jī),甚至未必適合于計算機(jī)的串口,所以統(tǒng)一RS485多機(jī)通信的協(xié)議就顯得非常有必要。