Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
高級會員
|
參照:
不過,基本上 CAN 還算是符合 Real-time 的吧! 目前我遇到個問題想請問各位一下,我發覺 CAN 的 message 的傳送 ID 可動態的規劃,就是發生碰撞後,我可修改 ID 值再次傳送 message ,請先不要問我意圖為何,因為我知道這會有一些問題的發生,想請問各位的是,如果遇到相同ID 的 message 且又發生碰撞的話,彼此是否各等待一段時間再偵測 bus 的狀態再一次的重新傳送,且由於各等待的時間是不一定的,所以可能會錯開傳送的時間點,因此即使是相同的 ID 的話,也可正常的傳送資料,right? P.S 由於我想到 CAN 的當初設計是,只要 CAN Bus 建好後,其它的 Node 都可自由的連結上或離開 CAN Bus ,所以我想到如果新加入一個 Node 那它應該有一個基本的 ID ,而這 ID 就可能會重複到其它的 Node 了! (我是基於如要增加 Node ,但又不知要怎麼的給它優先權多高的 ID ,所想出的動態規劃方法)
發表於: 2007/10/31 16:23
|
|||
|
Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
資深會員
|
就是因為如此,CAN BUS並無法保證訊息的傳遞時間,無法符合即時性,才會有FLEXRAY和TTCAN的產生.
發表於: 2007/10/30 20:04
|
|||
|
Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
版主
|
1. CAN 傳輸時發生碰撞是常有的事,這次打輸人家,在等下一次的機會反正碰撞、等待、傳送都是 CAN Engine 幫我完成的。
2. CAN Bus 再忙,Bus 總是會有很多空閒的時間(除非有人當機咬死了 Bus),它不是像你所想像的忙到沒有空隙,實際上大部分的時間是很閒的。 3. CAN 實際在運用沒有人會再同一條 CAN Bus 上聯接那嚜多的 Nodes,按 CAN Transisver也大概能推到 100 個 Nodes , 真正的應用還有 CAN Bridge 的東西作為兩個 CAN 網路的連接橋樑。每個 CAN 網路都自行成一個網路通訊,有需要跟外界溝通時再透過 Bridge 與其它網路溝通或透過 Bridge 轉成較小的 LIN Bus。
發表於: 2007/10/29 10:16
|
|||
|
Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
高級會員
|
CAN BUS和RS-485最大的差別就是COLLISION的機制,RS485是不太能允許MESSAGE衝撞發生,太多的COLLISIONS,嚴重會元件損壞,所以RS485是採用主從式一問一答架構。CAN BUS 可以接很多元件,並且付于這些元件優先權,優先權高的也是表示最重要的,所以當最重要的元件一直發出訊息給大家,優先權低的只能一直等待BUS的IDLE出現,才能送出MESSAGE取得BUS控制權,這種機制也符合即時系統的需求。
發表於: 2007/10/29 10:00
|
|||
|
Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
高級會員
|
參照:
嗯嗯..... 這麼說的話,即使同時發生多次碰撞也會自行排列傳送,之後的 訊息會等到前面發生過碰撞的 Nodes 傳完資料再開始傳送囉? 有的時候我是蠻好奇的,想說只有一條 Bus 線,如果在汽車或機 台上的話, CAN Node 的個數可能都是幾百或上千個,那樣的話 碰撞的情形可是很常見的,那這樣還能做到 real-time 的控制嗎? 因為感覺上就像是"佇列"方式的排隊等著傳送資料,這樣如有更 緊急的訊息需傳送的話,這樣也能優先的處理嗎? (有插隊機制嗎? ..... ㄎㄎ)
發表於: 2007/10/27 1:01
|
|||
|
Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
初級會員
|
不會
因為CAN的設定是直接讓此次碰撞發生時 判定為低優先權的訊息排在高優先權訊息後傳送 其他的訊息會等此兩段訊息傳完才開始傳
發表於: 2007/10/26 17:30
|
|||
|
Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
高級會員
|
請問這樣會不會發生循環等待?
一直被優先權較高的 Node 搶走發言權,使得自己的資料都一直無法傳送出去? CAN 應該能解決這類的問題吧? 在學校是聽老師說, CAN 會將這次發生碰撞且沒傳送資料的 Node 給提高其優 先權以避免下次一直被搶走發言權! 請問不是這樣的嗎?
發表於: 2007/10/26 16:55
|
|||
|
Re: 請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
管理員
|
你好,
CAN 的仲裁方式是以 ID 欄位來比較的, 而且是由 CAN Engine 的硬體方式來逐位元比較. 然後優先權較低的會自動的讓出傳送權轉而進入接收狀態. (Dominate 位元優先權比 recessive 還高) 讓出傳送權的 Node 會於下一個可再送資料的 Time Solt 再嘗試傳送, 但並不會改變 ID 啦 ! 只會把原來的 ID + Data 重送而已. 除非程式將待傳送中的資料封包 Abort 然後重新改寫. 祝你開發順利 :)
發表於: 2007/10/26 13:21
|
|||
|
請問 CAN 的碰撞問題!
|
||||
---|---|---|---|---|
高級會員
|
我在找的資料上,看到 CAN 對於碰撞問題的解決方式,是採用"逐位競爭"的方式來解決碰撞及避免資料一直傳送不出的問題,資料上是寫發生碰撞的 CAN Node(未傳資料的) 會自行將優先權提高,用以在下次傳送資料!
不過我實機測試的結果,我測不出它的 message ID 的變化,請問所謂的"逐位競爭",是真的修改其 Node 所要傳送的 message 的 ID 值嗎?
發表於: 2007/10/25 17:09
|
|||
|