485
RS485是一種常用的工業(yè)現(xiàn)場(chǎng)總線,由于其只是電氣連接,所以在使用時(shí),還需要一個(gè)通信協(xié)議來(lái)定義各設(shè)備的具體通信方式,以實(shí)現(xiàn)多設(shè)備有秩序地使用總線。
一般地,RS485總線上所使用的是一主多從通信協(xié)議,采用輪詢方式進(jìn)行數(shù)據(jù)通信。也即一條RS485總線上,只有一臺(tái)主機(jī),其余的都是從機(jī),主從機(jī)之間要進(jìn)行通信時(shí),是需要主機(jī)依次輪詢,輪詢到了要發(fā)數(shù)據(jù)的從設(shè)備,從設(shè)備才能發(fā)送數(shù)據(jù)。這種通信方式存在通信實(shí)時(shí)性,可靠性差,而且各個(gè)從設(shè)備之間是不能通信的。另一種稍微高級(jí)一點(diǎn)的RS485通信協(xié)議可以實(shí)現(xiàn)從設(shè)備之間的通信,但這還是需要主設(shè)備的協(xié)調(diào)。有點(diǎn)類似于USB通信協(xié)議,工作機(jī)理大致如下:從設(shè)備首先向主設(shè)備發(fā)送數(shù)據(jù)發(fā)送請(qǐng)求或數(shù)據(jù),再由主設(shè)備將數(shù)據(jù)發(fā)送給另外的從設(shè)備這種方式。
我想構(gòu)建一種基于RS485總線的多主通信協(xié)議,所有掛載在RS485總線上的設(shè)備均可自由地使用總線,而不需要先向主機(jī)申請(qǐng)。這樣的話就能夠大大提高地提高總線上設(shè)備的實(shí)時(shí)性,可靠性。在這之中,比較關(guān)鍵要解決的是:總線競(jìng)爭(zhēng)以及仲裁機(jī)制。
為此,我設(shè)計(jì)了這樣一個(gè)機(jī)制:設(shè)備在RS485總線進(jìn)行數(shù)據(jù)發(fā)送前,先檢測(cè)當(dāng)前總線是否有數(shù)據(jù)正在傳輸,如果沒(méi)有,則先發(fā)送一串?dāng)?shù)據(jù),用以聲明總線被占用。然后進(jìn)行有效數(shù)據(jù)發(fā)送,并等待DATA_ACK.
數(shù)據(jù)目標(biāo)設(shè)備在接收到數(shù)據(jù)后,此時(shí)僅可發(fā)送DATA_ACK信息,用以告訴數(shù)據(jù)發(fā)送設(shè)備已經(jīng)收到信息。之后數(shù)據(jù)發(fā)送設(shè)備,再次在總線上發(fā)送信息,聲明釋放總線。在這期間,其它掛接在RS485總線上的設(shè)備也能夠接收到數(shù)據(jù),不過(guò)因?yàn)榭偩€已經(jīng)被聲明占用,將不得
發(fā)送任何數(shù)據(jù)。
在這之中,發(fā)現(xiàn)兩個(gè)可能的原因還是會(huì)導(dǎo)致總線競(jìng)爭(zhēng): 1、RS485總線上的設(shè)備接收到的總線占用和總線釋放聲明信息有誤碼,導(dǎo)致解析失敗。設(shè)備就相當(dāng)于沒(méi)有收到總線占用和釋放聲明,而如果這個(gè)期間進(jìn)行數(shù)據(jù)發(fā)送,就可能出錯(cuò)。
2、RS485總線上,有兩個(gè)或多個(gè)設(shè)備,同時(shí)聲明總線占用。此時(shí)已經(jīng)導(dǎo)致總線競(jìng)爭(zhēng),從而所有設(shè)備都沒(méi)有收到有效的總線占用信息,那么之后的數(shù)據(jù)發(fā)送仍會(huì)很有可能出現(xiàn)總線競(jìng)爭(zhēng)。
當(dāng)然,所有的設(shè)備在進(jìn)行任何數(shù)據(jù)發(fā)送前,都會(huì)先進(jìn)行總線載波檢測(cè),以判斷當(dāng)前總線上是否有數(shù)據(jù)發(fā)送。但仍有一定的概率出現(xiàn)兩設(shè)備幾乎同時(shí)開(kāi)始發(fā)送一串?dāng)?shù)據(jù)的第一位數(shù)據(jù),從而導(dǎo)致競(jìng)爭(zhēng)。
查看了一下CAN總線的總線競(jìng)爭(zhēng)以及仲裁機(jī)制,其接口芯片可以一邊發(fā)送,一邊讀取當(dāng)前總線狀態(tài),如果發(fā)送位和讀取到的總線狀態(tài)不一致,則自動(dòng)丟失總線權(quán),這種非破壞的總線競(jìng)爭(zhēng)方式挺好,就是貌似RS485上無(wú)法實(shí)現(xiàn),因?yàn)镽S485芯片不能邊發(fā)送邊讀取。
大家麻煩給點(diǎn)意見(jiàn)哦,也不知有哪位成功實(shí)現(xiàn)了這種多主通信的嗎?
=====================================================分割線=========================================================>>
結(jié)貼前,對(duì)大家討論的結(jié)論歸納如下:
要實(shí)現(xiàn)RS485總線上的多主通信機(jī)制,首先在硬件設(shè)計(jì)上,需要能夠讓485芯片的TX和RX使能分別單獨(dú)控制;采用半驅(qū)方式進(jìn)行485總線驅(qū)動(dòng)更好,這樣可以實(shí)現(xiàn)類似CAN總線的總線競(jìng)爭(zhēng)檢測(cè)以及仲裁機(jī)制;
軟件設(shè)計(jì)上,每個(gè)設(shè)備在進(jìn)行總線數(shù)據(jù)發(fā)送前,必須先偵聽(tīng)總線是否有數(shù)據(jù)正在傳輸,如果沒(méi)有,則啟動(dòng)傳輸。在傳輸?shù)倪^(guò)程中,在逐字節(jié)地發(fā)送數(shù)據(jù)的同時(shí),也一直偵聽(tīng)并讀取總線上的數(shù)據(jù),如果讀取到的數(shù)據(jù)和發(fā)送的不一致,就說(shuō)明總線上此時(shí)還有其它設(shè)備正在發(fā)送,由此實(shí)現(xiàn)總線競(jìng)爭(zhēng)檢測(cè);
如果要做到類似CAN的無(wú)破壞總線競(jìng)爭(zhēng)檢測(cè)以及仲裁,那么還需要做到傳輸數(shù)據(jù)的逐位檢測(cè),不過(guò)這貌似對(duì)一般的Uart口來(lái)說(shuō)并不容易實(shí)現(xiàn);
另一種比較穩(wěn)定的多主通信方式就是使用令牌,令牌在各個(gè)設(shè)備之間傳遞,只有擁有令牌的設(shè)備才有總線使用權(quán)。
以上為討論后的歸納總結(jié),非常謝謝各位朋友的指點(diǎn)。