• 正文
    • socket CAN概念
    • socket CAN的應(yīng)用
    • socket CAN通信過程
    • 如何使用socket CAN
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

飛凌嵌入式ElfBoard ELF 1板卡-CAN編程示例之socket CAN

2024/11/14
1749
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

socket CAN概念

socketcan子系統(tǒng)是在Linux下CAN協(xié)議(Controller Area Network)實現(xiàn)的一種實現(xiàn)方法。 CAN是一種在世界范圍內(nèi)廣泛用于自動控制、嵌入式設(shè)備和汽車領(lǐng)域的網(wǎng)絡(luò)技術(shù)。Linux下最早使用CAN的方法是基于字符設(shè)備來實現(xiàn)的,與之不同的是Socket CAN使用伯克利的socket接口和linux網(wǎng)絡(luò)協(xié)議棧,這種方法使得can設(shè)備驅(qū)動可以通過網(wǎng)絡(luò)接口來調(diào)用。Socket CAN的接口被設(shè)計的盡量接近TCP/IP的協(xié)議,讓那些熟悉網(wǎng)絡(luò)編程的程序員能夠比較容易的學(xué)習(xí)和使用。

socket CAN的應(yīng)用

在Socket CAN之前Linux中已經(jīng)有了一些CAN的實現(xiàn)方法,那為什么還要啟動Socket CAN這個項目呢?大多數(shù)已經(jīng)存在的實現(xiàn)方法僅僅作為某個具體硬件的設(shè)備驅(qū)動,它們往往基于字符設(shè)備并且提供的功能很少。那些方案通常是由一個針對具體硬件的設(shè)備驅(qū)動提供的字符設(shè)備接口來實現(xiàn)原始can幀的發(fā)送和接收,并且直接和控制器硬件打交道。幀隊列和ISO-TP這樣的高層協(xié)議必須在用戶空間來實現(xiàn)。就像串口設(shè)備接口一樣,大多數(shù)基于字符設(shè)備的實現(xiàn)在同一時刻僅僅支持一個進程的訪問。如果更換了CAN控制器,那么同時也要更換另一個設(shè)備驅(qū)動,并且需要大多數(shù)應(yīng)用程序重新調(diào)整以適應(yīng)新驅(qū)動的API。

Socket CAN被設(shè)計用來克服以上種種不足。這種新的協(xié)議族實現(xiàn)了用戶空間的socket接口,它構(gòu)建于Linux網(wǎng)絡(luò)層之上,因此可以直接使用已有的隊列功能。CAN控制器的設(shè)備驅(qū)動將自己作為一個網(wǎng)絡(luò)設(shè)備注冊進Linux的網(wǎng)絡(luò)層,CAN控制器收到的CAN幀可以傳輸給高層的網(wǎng)絡(luò)協(xié)議和CAN協(xié)議族,反之,發(fā)送的幀也會通過高層給CAN控制器。傳輸協(xié)議模塊可以使用協(xié)議族提供的接口注冊自己,所以可以動態(tài)的加載和卸載多個傳輸協(xié)議。事實上,CAN核心模塊不提供任何協(xié)議,也不能在沒有加載其它協(xié)議的情況下單獨使用。同一時間可以在相同或者不同的協(xié)議上打開多個套接字,可以在相同或者不同的CAN ID上同時監(jiān)聽和發(fā)送(listen/send)。幾個同時監(jiān)聽具有相同ID幀的套接字可以在匹配的幀到來后接收到相同的內(nèi)容。如果一個應(yīng)用程序希望使用一個特殊的協(xié)議(比如ISO-TP)進行通信,只要在打開套接字的時候選擇那個協(xié)議就可以了,接下來就可以讀取和寫入應(yīng)用數(shù)據(jù)流了,根本無需關(guān)心CAN-ID和幀的結(jié)構(gòu)等信息。

socket CAN通信過程

socket通信模型如下圖:

(一)在服務(wù)端建立一個ServerSocket,綁定相應(yīng)的端口,并且在指定的端口進行偵聽,等待客戶端的連接。

(二)當(dāng)客戶端創(chuàng)建連接Socket并且向服務(wù)端發(fā)送請求。

(三)服務(wù)器收到請求,并且接受客戶端的請求信息。一旦接收到客戶端的連接請求后,會創(chuàng)建一個鏈接socket,用來與客戶端的socket進行通信。 通過相應(yīng)的輸入/輸出流進行數(shù)據(jù)的交換,數(shù)據(jù)的發(fā)送接收以及數(shù)據(jù)的響應(yīng)等等。

(四)當(dāng)客戶端和服務(wù)端通信完畢后,需要分別關(guān)閉socket,結(jié)束通信。

socket通信實現(xiàn)步驟:

了解Socket通信模型后,就可以簡化出Socket通信的實現(xiàn)步驟:

(一)創(chuàng)建ServerSocket和Socket。

(二)打開鏈接到Socket的輸入/輸出流。

(三)按照協(xié)議對Socket進行讀/寫操作。

(四)關(guān)閉輸入輸出流、關(guān)閉Socket。

如何使用socket CAN

就像TCP/IP協(xié)議一樣,在使用CAN網(wǎng)絡(luò)之前你首先需要打開一個套接字。CAN的套接字使用到了一個新的協(xié)議族,所以在調(diào)用socket(2)這個系統(tǒng)函數(shù)的時候需要將PF_CAN作為第一個參數(shù)。當(dāng)前有兩個CAN的協(xié)議可以選擇,一個是原始套接字協(xié)議( raw socket protocol),另一個是廣播管理協(xié)議BCM(broadcast manager)。你可以這樣來打開一個套接字:

在成功創(chuàng)建一個套接字之后,你通常需要使用bind(2)函數(shù)將套接字綁定在某個CAN接口上。在綁定 (CAN_RAW)或連接(CAN_BCM)套接字之后,你可以在套接字上使用read(2)/write(2),也可以使用send(2)/sendto(2)/sendmsg(2)和對應(yīng)的recv*操作。當(dāng)然也會有CAN特有的套接字選項。

飛凌嵌入式

飛凌嵌入式

保定飛凌嵌入式技術(shù)有限公司,創(chuàng)建于2006年,是一家專注嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計和生產(chǎn)的高新技術(shù)企業(yè),是國內(nèi)較早專業(yè)從事嵌入式技術(shù)的企業(yè)之一。 經(jīng)過十幾年的發(fā)展與積累,公司擁有業(yè)內(nèi)優(yōu)秀的軟硬件研發(fā)團隊,在北京及保定建立兩大研發(fā)基地,在蘇州、深圳設(shè)有華東、華南技術(shù)服務(wù)中心,并在北美、歐洲以及亞太等其他國家和地區(qū)擁有國際業(yè)務(wù)網(wǎng)絡(luò)。公司研發(fā)的智能設(shè)備核心平臺廣泛應(yīng)用于物聯(lián)網(wǎng)、工控、軌道交通、醫(yī)療、電力、商業(yè)電子、智能家居、安防、機器人、環(huán)境監(jiān)測等諸多領(lǐng)域。

保定飛凌嵌入式技術(shù)有限公司,創(chuàng)建于2006年,是一家專注嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計和生產(chǎn)的高新技術(shù)企業(yè),是國內(nèi)較早專業(yè)從事嵌入式技術(shù)的企業(yè)之一。 經(jīng)過十幾年的發(fā)展與積累,公司擁有業(yè)內(nèi)優(yōu)秀的軟硬件研發(fā)團隊,在北京及保定建立兩大研發(fā)基地,在蘇州、深圳設(shè)有華東、華南技術(shù)服務(wù)中心,并在北美、歐洲以及亞太等其他國家和地區(qū)擁有國際業(yè)務(wù)網(wǎng)絡(luò)。公司研發(fā)的智能設(shè)備核心平臺廣泛應(yīng)用于物聯(lián)網(wǎng)、工控、軌道交通、醫(yī)療、電力、商業(yè)電子、智能家居、安防、機器人、環(huán)境監(jiān)測等諸多領(lǐng)域。收起

查看更多

相關(guān)推薦