首先,什么是CAN呢。
學過散裝英語的人,應該都有知道有一個單詞叫can 。
那我們要講的這個CAN,很多時候,發音可以和can一樣。
這么說來,CAN通信的CAN,并不是一個單詞,而是縮寫了。
那這個CAN是由什么縮寫的呢。
Controller
Area
Network
組合起來就是CAN了。接觸過CAN的讀者應該了解,CAN應用在汽車總線比較多。
一開始我也以為CAN里的C,指的是Car。Car Area Network ,唉,好像也可以哦。
拋開散裝英語,這那個CAN,大意就是一種控制器的局域(區域)網絡總線了。
就是支持CAN通信的設備,通過總線接到一個通信局域網絡里。這個局域網和我們說的以太網的局域網不是一回事。
實際上,在控制器通信數據采集領域,其實應該是由以太網,串口和CAN三分天下的局面。
三者都支持總線。但是我們常見的主要是以太網和串口的控制器居多。高端點的主要是以太網,低端的設備主要就是串口。可能也和易用性,成本等原因,當然也有領域的不同吧。
像CAN主要在于汽車領域為主。
那些說還有什么SPI,IIC,IIS,1-Wire之類的,你出去。此總線非彼總線。
那么CAN不是以太網,它是什么呢。
請看。
在筆者報名參加了88塊學畫畫培訓班之后,畫下了如下不是很嚴謹的CAN總線圖。
為什么說不嚴謹呢。因為沒有畫上地線,還在終端電阻之類的。
眼力好的同學呢,很快就發現了,CAN總線,其實就是由H線和L線組成的。
似乎有一種似曾相識的感覺,卻又說不上為什么,這么咋一看,說它是485總線都會有人信。
單純從線來看,確實和485總線很相似。所以接下來介紹CAN,會盡量和我們熟悉的485總線類比。
CAN總線的這兩根線呢,一般叫做CAN-High和CAN-Low。簡稱嘛就是CAN-H和CAN-L .
再簡一點就是H和L了。
會有同學問了,可以再簡一些嘛。這個問題問得好。
據悉,有些485設備已經可以不區分+和-,也就是485的A和B兩根線可以反著接也能自動識別和適應。
但是在CAN設備上,這個不是很成熟,所以,還是盡量要區分H和L。
同樣的,CAN的通信,也是靠H和L兩根線的差分信號進行傳輸信號的。這點和485很類似了。
(圖片來源于網絡)
通過不同的電平組合信號,就能傳輸0和1信號,也就是一個位的信號。
8個位就組成一個字節。N個字節就組成了CAN協議了。
(圖片來源于網絡)
(圖片來源于網絡)
CAN的通信和485(也就是串口通信)很類似,也是有什么起始位,停止位之類的。
只是CAN會復雜一些,多了很多段。
其實多出來的內容,無非就是增加CAN通信的各種穩定性,協議可靠性等等。
對用戶來說,那個起始位停止位其實不關心的。
只需要CAN設備雙方通信參數匹配,就可以用來傳輸應用層數據了。
所以應用層數據才是我們比較關心的,也是我們使用中用到的。
剛才也提到了,CAN通信雙方參數匹配,主要是要適配哪些呢。
像串口通信,要設置的波特率,數據位,停止位,校驗位。
但是CAN呢,很多時候,只需要設置波特率就可以了。
畢竟波特率也是影響傳輸速度和距離的關鍵因素,至于什么數據位,校驗位,CAN通信懶得去讓用戶設置,全都統一多好。省得用戶一個個去操心了,是吧。
與其叫波特率,其實叫比特率更為合適。不同的比特率,能支持的通信線長度也不一樣。具體根據需要匹配即可。
超過500米的通信線通信,筆者還沒有嘗試過,有條件的同學,可以去購買繁易支持CAN通信的FBox網關或者觸摸屏去使用。
前面介紹了一大堆,簡單用幾句話概括就是:
CAN通信只需要兩根線(H,L),雙方設置同樣的波特率,就可以進行收發數據。
CAN收發數據,收的是什么,發的又是什么呢。
這應該是CAN通信關鍵的內容了。
CAN通信和串口通信不一樣。
串口通信至少要發送一個字節,通信雙方需要約定好通信內容格式長度等,比較著名的就是modbus協議,當然還有各種PLC協議的串口協議,也都是約定好格式。
而CAN通信,在這點就稍微好一些,只要是CAN通信的,都是標準的。
不管是哪一家的CAN設備,通信雙方收發的內容格式,就是統一的。
就像串口通信,都規定使用modbus rtu協議一樣。
那我們這個CAN協議報文,就和modbus 類比一下。
modbus的通信,主要是讀取位和字變量。位有0x,1x,字有3x,4x。地址訪問都是65535個。
就拿4x地址來說,就是有65535個字。一個字是16個位。
可以把modbus理解為16位數據寬度的協議。modbus就類比于16位系統電腦。
看看CAN報文。CAN_ID如果類比于4X這樣的寄存器地址的話,地址是有536870911個地址,5億個地址。
然后每個地址能表示的數據是8個字節,也就是4個字。64個位。
那CAN就是64位系統了。
modbus為6萬個字。
CAN為5億個4字,10億個雙字,20億個字。地址表示空間范圍遠超串口的modbus 。
在CAN報文里,最前面三個位,主要是標志位。用于表示不同的通信類型。
就剛才的報文格式來看,好像說不上為什么,感覺看得懂,但又哪里不太明白,也不知道怎么問。
學過modbus報文的人都知道,modbus報文呢,有主站發送方和從站回復方的。主站請求數據,從站回復數據。主從站報文不一樣的。。
這就對了,從報文上,沒有提到誰是主,誰是從哦。難道主從發送的都是同樣的報文。
沒錯,就是這么大膽。
比如0000 0012 08 00 01 02 03 04 05 06 07 這個CAN報文,
指就是幀ID地址為0x12,發送8個數據長度,數據內容是00 01 02 03 04 05 06 07 。
主站可以發送給從站,從站也可以發送給主站。
CAN報文可以沒有主從概念。但是我們從使用上,可以分主從。
從站發這個報文給主站,相當于上報從站的數據給主站,比如溫度,濕度等變量。
如果是主站發送這個報文給從站,相當于主站給從站發送寫命令或者控制命令。
思維敏捷的同學馬上就反應過來了。
我主站都沒有問呢,你個從站就給我發內容,你知道我要讀什么內容了嗎?
剛才提到,CAN總線的地址負載能力大概在5億個左右。如果是標準幀,只有0x7FF個。
那么就需要使用CAN通信設備的人,進行地址規劃,什么地址內容代表什么。
話是這么說了,但是一想,好像哪里不對。modbus是可以主動請求數據的。難道CAN也不行嗎?
這就是所謂的遠程幀了。
遠程幀呢,大概意思就是,主站如果想請求某個幀ID(地址)的數據,剛向總線發送一個遠程幀。也就是這個報文上,某個標志位置1的事。這時候對方設備向總線發送數據幀,就完成一次主動請求數據了。
補充一下,另一個設備收到遠程幀呢,在CAN里面,并不會要求其它設備一定要回復。回復不回復遠程幀,取決于這個CAN設備的程序,可以回,可以不回,愛回不回。
以上就是通俗的介紹一些CAN通信的內容了,拋開那些繁瑣的細節。畢竟對我們CAN的使用者來說,不需要深入了解CAN里的每一個細節。
有時候就是把CAN設備拿出來,把兩根線接好,上電,通信進行通信,看到數據即可。大不了就是設置了一個波特率。
雙方再維護一下數據點表,哪個地址代表什么意思。對著數據點表添加數據,調試,通信正常,關機,走人。
CAN通信只是一個基本的通信接口或者協議。
在CAN之后,還有CANOpen之樣的二次協議。
評論