Linux上使用CAN通信的方法

一幢痘、CAN協(xié)議簡介

1.1 CAN發(fā)展歷程

CAN發(fā)展的重要歷史事件

1.2 標準CAN與拓展CAN區(qū)別

CAN 1.0 定義的 CAN 具有 11 位消息標識唬格,提供可能的 2048 個消息標識符。2.0 版允許有效的 29 位消息 ID颜说。為了使新的 CAN 設(shè)備與舊的實現(xiàn)兼容购岗,CAN 2.0 規(guī)范分為兩部分,2.0A 和 2.0B门粪。在 CAN 2.0A 中喊积,消息格式與僅使用 11 位消息 ID 的舊版本 CAN 一致。 CAN 2.0B 中玄妈,允允許有效的 29 位消息 ID乾吻,然后可以在被動或主動模式下實現(xiàn) CAN 2.0B髓梅。CAN 版本 1.0 和 2.0A 被稱為“標準 CAN”,因為它們都使用 11 位消息 ID溶弟。CAN 2.0 B 被稱為“擴展 CAN”女淑,因為它使用擴展的 29 位消息 ID

1.3 參考

https://www.can-cia.org/can-knowledge/can/can-history/
https://en.wikipedia.org/wiki/CAN_bus#History
https://www.edaboard.com/threads/difference-between-can1-0-and-can-2-0.217912/

二、基于CAN的典型應(yīng)用協(xié)議

SAE J1939/ISO11783
CANOpen
CANaerospace
DeviceNet
NMEA 2000

三辜御、Linux上使用CAN的幾種方式

3.1 Linux中CAN設(shè)備掛載的總線類型

Linux可以通過串口鸭你、USB、網(wǎng)口擒权、PCIE等接口與CAN設(shè)備間接進行通信袱巨。

CAN設(shè)備連接在不同的硬件接口時,意味著CAN設(shè)備被掛載在Linux中不同的總線上碳抄,如USB總線愉老、PCI-E總線(直接通過PCI-E與linux通訊),因此Linux采用不同的通訊協(xié)議與CAN設(shè)備進行通訊剖效。

3.2 CAN轉(zhuǎn)串口

  • 設(shè)備形態(tài):
    CAN轉(zhuǎn)串口
  • 數(shù)據(jù)傳輸流程:

Linux->串口->單片機->CAN

  • 通訊協(xié)議:

利用linux自帶的串口庫嫉入,或ros的serial庫對串口進行讀寫。

通過定義串口協(xié)議璧尸,如10個字節(jié)咒林,前兩個字節(jié)為CAN ID,后面8個字節(jié)為CAN Data爷光。通過此對串口發(fā)送數(shù)據(jù)垫竞,讓單片機對其進行轉(zhuǎn)換為CAN數(shù)據(jù)。

協(xié)議參考:https://manual.zlg.cn/web/#/64/2607

3.3 CAN轉(zhuǎn)USB

  • 設(shè)備形態(tài):
    CAN轉(zhuǎn)USB

注意蛀序,不是所有的周立功CAN轉(zhuǎn)USB設(shè)備都支持Linux欢瞪,見表:https://manual.zlg.cn/web/#/146

  • 數(shù)據(jù)傳輸流程:

Linux->USB->單片機->CAN

  • 通訊協(xié)議:

與CAN轉(zhuǎn)串口不一樣,利用的庫是libusb和libusbcan徐裸,對CAN轉(zhuǎn)USB數(shù)據(jù)直接進行讀寫

libusb是linux驅(qū)動遣鼓,可以操作USB接口對USB設(shè)備進行讀寫操作。

libusbcan是CAN轉(zhuǎn)USB設(shè)備廠商給的驅(qū)動重贺,其中定義了can數(shù)據(jù)幀的數(shù)據(jù)結(jié)構(gòu)體譬正,填充相應(yīng)的CAN ID和CAN Data,最后通過USB進行讀寫檬姥。

協(xié)議參考:https://manual.zlg.cn/web/#/55/2282

3.4 CAN轉(zhuǎn)網(wǎng)

  • 設(shè)備形態(tài):

    CAN轉(zhuǎn)網(wǎng)

  • 數(shù)據(jù)傳輸流程:

Linux->TCP(UDP)/IP->單片機->CAN

  • 通訊協(xié)議:

利用Linux的socket庫對網(wǎng)絡(luò)設(shè)備進行讀寫操作。

Linux通過IP地址利用Socket與CAN設(shè)備通信粉怕,一個TCP/UDP幀包中包含若干個連續(xù)的CAN幀健民,每個CAN幀包含若干個字節(jié),包含CAN ID和CAN Data贫贝。

協(xié)議參考:https://manual.zlg.cn/web/#/67/2693

3.5 CAN轉(zhuǎn)PCI-E

  • 設(shè)備形態(tài):
    PCI-E轉(zhuǎn)CAN

注意周立公CAN轉(zhuǎn)PCI-E設(shè)備秉犹,型號PCI-5010-P不支持Linux:https://manual.zlg.cn/web/#/146

  • 數(shù)據(jù)傳輸流程:

Linux->SocketCAN->單片機->CAN

  • 通訊協(xié)議:

Linux提供了SocketCAN接口蛉谜,使得CAN總線通信近似于和以太網(wǎng)的通信。網(wǎng)絡(luò)設(shè)備通過IP確定地址崇堵,CAN設(shè)備通過CAN ID確定地址型诚,如can0can1...

CAN ID可以通過ifconfig -a查看

Linux利用SocketCAN庫根據(jù)CAN的設(shè)備ID對其進行讀寫操作鸳劳,CAN的數(shù)據(jù)結(jié)構(gòu)在Socket CAN中被結(jié)構(gòu)體定義狰贯,填充相應(yīng)數(shù)據(jù)后發(fā)送即可。

協(xié)議參考:https://manual.zlg.cn/web/#/77/3180

3.6 USB轉(zhuǎn)CAN(CANable)

  • 設(shè)備形態(tài):
    USB轉(zhuǎn)CAN(SocketCAN)

開源地址:https://canable.io/

淘寶有售賣

  • 數(shù)據(jù)傳輸流程:

注意與上面周立功的CAN轉(zhuǎn)USB設(shè)備數(shù)據(jù)傳輸流程不同赏廓,利用的是SocketCAN涵紊,不是USB

Linux->SocketCAN->單片機->CAN

  • 通訊協(xié)議:

Linux利用SocketCAN庫根據(jù)CAN的設(shè)備ID對其進行讀寫操作幔摸,CAN的數(shù)據(jù)結(jié)構(gòu)在Socket CAN中被結(jié)構(gòu)體定義摸柄,填充相應(yīng)數(shù)據(jù)后發(fā)送即可。

SocketCAN簡介:https://en.wikipedia.org/wiki/SocketCAN
協(xié)議參考1:https://canable.io/getting-started.html#socketcan-linux
協(xié)議參考2:https://manual.zlg.cn/web/#/77/3180

四既忆、ROS中的CAN通信

4.1 ROS提供三個層次的驅(qū)動庫

三個層次的驅(qū)動庫

socketcan_interface是較為底層的包跃脊,與Linux的socketcan打交道。

socketcan_bridgeros中最常用的包庆亡,通過將接收到的topic轉(zhuǎn)換為can數(shù)據(jù)發(fā)出去匾乓,或者把接收到的can數(shù)據(jù)轉(zhuǎn)換為ros的topic。

ros_canopen是基于canopen應(yīng)用協(xié)議的包又谋,是上層協(xié)議拼缝。

4.2 socketcan_bridge包

該功能以三個節(jié)點的形式提供:socketcan_bridge_nodesocketcan_to_topic_nodetopic_to_socketcan_node彰亥。要從同一個 CAN 設(shè)備接收和發(fā)送幀咧七,需要使用socketcan_bridge_node來防止每個發(fā)送的消息都回顯到接收主題。

4.2.1 socketcan_bridge_node

從 SocketCAN 設(shè)備接收幀并將這些幀發(fā)布到主題上任斋,同時它偵聽 CAN 消息并將這些消息發(fā)送到 SocketCAN继阻。發(fā)送到 CAN 設(shè)備的幀不會作為接收消息發(fā)布。

  • 訂閱的話題名稱:sent_messages(can_msgs/Frame)废酷,此處收到的消息將被發(fā)送到 SocketCAN 設(shè)備瘟檩。

  • 發(fā)布的話題名稱:received_messages (can_msgs/Frame),在 SocketCAN 設(shè)備上接收到的幀在本主題中發(fā)布澈蟆。

  • ROS節(jié)點參數(shù):~can_device (string, default: can0)墨辛,SocketCAN 設(shè)備的名稱,默認情況下這些設(shè)備被命名為can0及以上趴俘。

4.2.2 socketcan_to_topic_node

將在 SocketCAN 設(shè)備上接收到的幀發(fā)布到topic睹簇。

  • 發(fā)布的話題名稱:received_messages (can_msgs/Frame)奏赘,在 SocketCAN 設(shè)備上接收到的幀在本主題中發(fā)布。

  • ROS節(jié)點參數(shù):~can_device (string, default: can0)太惠,SocketCAN 設(shè)備的名稱磨淌,默認情況下這些設(shè)備被命名為can0及以上。

4.2.3 topic_to_socketcan_node

將收到的topic的 CAN 消息發(fā)送到 SocketCAN 設(shè)備凿渊。

  • 訂閱的話題名稱:sent_messages(can_msgs/Frame)梁只,此處收到的消息將被發(fā)送到 SocketCAN 設(shè)備。

  • ROS節(jié)點參數(shù):~can_device (string, default: can0)嗽元,SocketCAN 設(shè)備的名稱敛纲,默認情況下這些設(shè)備被命名為can0及以上。

4.3 基于ROS中轉(zhuǎn)節(jié)點松耦合的CAN通信

4.3.1 松耦合需求的原因

對于一些成熟的包剂癌,或者比較復(fù)雜的包淤翔,要想把其中的topic轉(zhuǎn)為CAN數(shù)據(jù)發(fā)出去,有兩種修改方式:

    1. 直接修改源碼中相應(yīng)topic的數(shù)據(jù)類型佩谷,或者在源碼中新發(fā)布一個can_msgs/Frame數(shù)據(jù)類型旁壮,名稱為sent_messages的topic
    1. 新建一個中轉(zhuǎn)節(jié)點,接收該復(fù)雜節(jié)點的topic(消息類型為該復(fù)雜節(jié)點的消息類型)谐檀,將其轉(zhuǎn)換為一個can_msgs/Frame數(shù)據(jù)類型抡谐,名稱為sent_messages的topic,將反饋的can信息桐猬,通過指定的topic麦撵,反饋給該復(fù)雜節(jié)點。

第二種方式更為簡單和快速溃肪,但會增加通信中轉(zhuǎn)延時免胃,ROS的節(jié)點通信是基于TCP/IP,對于本機節(jié)點通信而言惫撰,此延時大概在1ms以內(nèi)(百兆網(wǎng)卡以上)羔沙。

4.3.2 中轉(zhuǎn)節(jié)點

對于該中轉(zhuǎn)節(jié)點,需要訂閱兩個topic厨钻,發(fā)布兩個topic

  • 訂閱:
  1. 復(fù)雜節(jié)點發(fā)布的topic
  2. socketcan_bridge_node節(jié)點的topic:received_messages
  • 發(fā)布:
  1. 復(fù)雜節(jié)點訂閱的topic
  2. socketcan_bridge_node節(jié)點的topic:sent_messages

4.3.3 CAN數(shù)據(jù)幀

socketcan_bridge_node的話題的消息類型都為ROS內(nèi)置消息類型can_msgs/Frame

Header header
uint32 id
bool is_rtr
bool is_extended
bool is_error
uint8 dlc
uint8[8] data

需要填充的數(shù)據(jù)是

  • id:CAN ID
  • dlc:數(shù)據(jù)長度扼雏,一般為8
  • is_extended:是否是拓展幀,一般為0
  • uint8[8] data:can數(shù)據(jù)

4.3.4 使用

一般把該中轉(zhuǎn)節(jié)點與socketcan_bridge_node放在一個launch文件中夯膀。

如果socketcan_bridge_node節(jié)點的名稱沖突了诗充,可以在launch文件中添加group,或者remap話題名稱诱建。

五其障、總結(jié)

推薦CANable + socketcan_bridge包實現(xiàn)ROS中的CAN通信!

Github:https://github.com/wanghuohuo0716/ros_can_driver

ROS socketcan_bridge包使用參考:
https://blog.csdn.net/zyf_to_utopia/article/details/116209605
https://blog.csdn.net/m0_58322903/article/details/121630592
https://blog.csdn.net/wangrunhuan/article/details/117962857

SocketCAN介紹:
https://en.wikipedia.org/wiki/SocketCAN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涂佃,一起剝皮案震驚了整個濱河市励翼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辜荠,老刑警劉巖汽抚,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伯病,居然都是意外死亡造烁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門午笛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惭蟋,“玉大人,你說我怎么就攤上這事药磺「孀椋” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵癌佩,是天一觀的道長木缝。 經(jīng)常有香客問我,道長围辙,這世上最難降的妖魔是什么我碟? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮姚建,結(jié)果婚禮上矫俺,老公的妹妹穿的比我還像新娘。我一直安慰自己掸冤,他們只是感情好厘托,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贩虾,像睡著了一般催烘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缎罢,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天伊群,我揣著相機與錄音,去河邊找鬼策精。 笑死舰始,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的咽袜。 我是一名探鬼主播丸卷,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼询刹!你這毒婦竟也來了谜嫉?” 一聲冷哼從身側(cè)響起萎坷,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沐兰,沒想到半個月后哆档,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡住闯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年瓜浸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比原。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡插佛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出量窘,到底是詐尸還是另有隱情雇寇,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布绑改,位于F島的核電站谢床,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厘线。R本人自食惡果不足惜识腿,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望造壮。 院中可真熱鬧渡讼,春花似錦、人聲如沸耳璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨枯。三九已至蹬昌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攀隔,已是汗流浹背皂贩。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昆汹,地道東北人明刷。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像满粗,于是被迫代替她去往敵國和親辈末。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • DBUS是一種高級的進程間通信機制。DBUS支持進程間一對一和多對多的對等通信挤聘,在多對多的通訊時轰枝,需要后臺進程的角...
    愛喝茶de公羊雁蘭閱讀 683評論 0 1
  • 安裝最新版cmake & cmake https://blog.csdn.net/u011291667/artic...
    Jimmy_Tong閱讀 1,236評論 0 0
  • 作者:良知猶存 轉(zhuǎn)載授權(quán)以及圍觀:歡迎添加微信公眾號:羽林君 前言 主題:串口是一種設(shè)備間常用的通訊接口,ross...
    良知猶存閱讀 1,384評論 0 1
  • 需要注意的點: ------ 1组去、單片機讀取編碼器脈沖時采用外部中斷方式的缺點狸膏,由于脈沖頻率較高,單片機頻繁進入外...
    鄒y閱讀 345評論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫添怔、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62