如何基于RS485研究總線集散式測控系統(tǒng)?
2.3通信時序
由于RS-485通信是一種半雙工通信,發(fā)送和接受共用同一物理通道,在任意時刻只允許一臺單片機處于發(fā)送狀態(tài),因此要求應(yīng)答的單片機必須在偵聽到總線上呼叫信號己經(jīng)發(fā)送完畢,并且在沒有其他單片機應(yīng)答信號的情況下才能應(yīng)答。如果在時序上配合不好,就會發(fā)生總線沖突,使整個系統(tǒng)的通信癱瘓,無法正常工作。上位機與下位機之間如何進行數(shù)據(jù)傳輸,怎么提高通信的效率和可靠性,以及對通信過程中的故障處理,幀格式的約定,都需要一套詳盡的通信協(xié)議。
由于RS-485標(biāo)準(zhǔn)只制定了物理層電氣標(biāo)準(zhǔn),對上層通信協(xié)議沒有規(guī)定,這給設(shè)計者提供了很大的靈活性。一套完整的通信協(xié)議既要求結(jié)構(gòu)簡單,功能完備,又要求具有可擴充性與兼容性,并且盡量標(biāo)準(zhǔn)化。
3報文通信時的簡單協(xié)議
SLIP(Serial?Line?Intemet?Protocol)協(xié)議是串行線路網(wǎng)際協(xié)議,它是最早的、也是僅有的兩個串行IP協(xié)議之一。它實現(xiàn)了在串行通信線路上運行TCP/IP協(xié)議及其應(yīng)用服務(wù)的功能,為用戶上網(wǎng)提供了撥號IP模式。這里由它派生出改進協(xié)議:
(1)發(fā)送數(shù)據(jù)時的報文組裝
●取一個關(guān)鍵字0x55,一個報文的傳輸以0x55為引導(dǎo),中間可以有任意多的字節(jié)數(shù),最后以0xAA結(jié)束一個報文。關(guān)鍵字0x55和0xAA不參與檢驗和運算。
●如果傳輸?shù)脑紨?shù)據(jù)中含有0x55,則將其替換成0xFF+0x05,求校驗和時仍按一個0x55計算。
●如果傳輸?shù)脑紨?shù)據(jù)中含有0xAA,則將其替換成0xFF+0x0A,求校驗和時仍按一個0xAA計算。
●如果傳輸?shù)脑紨?shù)據(jù)中含有0xFF,則將其替換成0xFF+0x00,求校驗和時仍按一個0xFF計算。
●其余數(shù)據(jù)原樣發(fā)送。
例如:當(dāng)有0x55、,0x5A,0xAA,0xAS,0xFF這5個字節(jié)數(shù)據(jù)需要發(fā)送時,加上它們的算術(shù)校驗和0xFD,原始數(shù)據(jù)總共6個字節(jié)。按上述方法整合成的一個報文為:0x55,0xFF,0x05,0x5A,0xFF,0x0A,0xAS,0xFF,0x00,0xFD,0xFF,總共11 個字節(jié)。
(2)接收數(shù)據(jù)時的報文解讀
接受方將接收所有的數(shù)據(jù)并存入數(shù)組,主程序從數(shù)組中逐個取出數(shù)據(jù)并進行解讀,其過程如下:
●等待出現(xiàn)第一個0x55,以判斷一個數(shù)據(jù)包的開始。一旦讀到0x55,立即進行一個報文接收的初始化工作,包括數(shù)組單元清0,字節(jié)計數(shù)器清0等工作。
●從隊列中讀取一個數(shù)據(jù),如果不是0x55、0xAA或0xFF,則直接將數(shù)據(jù)存入數(shù)組。
●如果讀到0xFF,則繼續(xù)讀其下一個數(shù)據(jù),若是0x05,則替換回原始數(shù)據(jù)0x55;若是0x0A,則替換回原始數(shù)據(jù)xAA,若是0x00,則替換回原始數(shù)據(jù)0xFF。若都不是,則數(shù)據(jù)傳輸出錯。
●當(dāng)讀到xAA時,一個報文結(jié)束,關(guān)串口接收中斷,串口中斷流程圖如圖4所示。
圖4接收數(shù)據(jù)幀時的串口中斷流程圖
4結(jié)論
本文作者創(chuàng)新點:在多MCU之間中長距離通信的諸多方案中,RS-485因硬件設(shè)計簡單、控制方便、成本低廉等優(yōu)點。本文完成了基于RS-485的單主機一多從機的集散式控制系統(tǒng)的設(shè)計,包括上位機主控端與下位機從動端,并詳細(xì)分析了其通信時序。
評論