linux can总线接收数据串口打包上传_【Linux应用】CAN总线编程
1 CAN總線簡介
CAN是控制器局域網絡(Controller Area Network,CAN)的簡稱,由德國BOSCH公司開發,并最終成為國際標準(ISO 11898-1)。CAN總線主要應用于工業控制和汽車電子領域,是國際上應用最廣泛的現場總線之一。 CAN總線是一種串行通信協議,能有效地支持具有很高安全等級的分布實時控制。CAN總線的應用范圍很廣,從高速的網絡到低價位的多路接線都可以使用CAN。在汽車電子行業里,使用CAN 連接發動機的控制單元、傳感器、防剎車系統等,傳輸速度可達1Mbps。與前面介紹的一般通信總線相比,CAN總線的數據通信具有突出的可靠性、實時性和靈活性,在汽車領域的應用最為廣泛,世界上一些著名的汽車制造廠商都采用CAN總線來實現汽車內部控制系統與各檢測和執行機構之間的數據通信。目前,CAN總線的應用范圍已不僅僅局限于汽車行業,而且已經在自動控制、航空航天、航海、過程工業、機械工業、紡織機械、農用機械、機器人、數控機床、醫療器械及傳感器等領域中得到了廣泛應用。CAN總線規范從最初的CAN 1.2規范(標準格式)發展為兼容CAN 1.2規范的CAN 2.0規范(CAN 2.0A為標準格式,CAN 2.0B為擴展格式),目前應用的CAN器件大多符合CAN 2.0規范。
2 CAN總線的工作原理
當CAN總線上的節點發送數據時,以報文形式廣播給網絡中的所有節點,總線上的所有節點都不使用節點地址等系統配置信息,只根據每組報文開頭的 11 位標識符(CAN 2.0A 規范)解釋數據的含義來決定是否接收。這種數據收發方式稱為面向內容的編址方案。
當某個節點要向其他節點發送數據時,這個節點的處理器將要發送的數據和自己的標識符傳送給該節點的CAN總線接口控制器,并處于準備狀態;當收到總線分配時,轉為發送報文狀態。數據根據協議組織成一定的報文格式后發出,此時網絡上的其他節點處于接收狀態。處于接收狀態的每個節點對接收到的報文進行檢測,判斷這些報文是否是發給自己的以確定是否接收。
由于CAN總線是一種面向內容的編址方案,因此很容易建立高水準的控制系統并靈活地進行配置我們可以很容易地在CAN總線上加進一些新節點而無須在硬件或軟件上進行修改。
當提供的新節點是純數據接收設備時,數據傳輸協議不要求獨立的部分有物理目的地址。此時允許分布過程同步化。也就是說,當總線上的控制器需要測量數據時,數據可由總線上直接獲得,而無需每個控制器都有自己獨立的傳感器。
3 CAN總線的工作特點
CAN總線的有以下三方面特點:可以多主方式工作,網絡上的任意節點均可以在任意時刻主動地向網絡上的其他節點發送信息,而不分主從,通信方式靈活。網絡上的節點(信息)可分成不同的優先級,可以滿足不同的實時要求。采用非破壞性位仲裁總線結構機制,當兩個節點同時向網絡上傳送信息時,優先級低的節點主動停止數據發送,而優先級高的節點可不受影響地繼續傳輸數據。
4 CAN總線協議層次結構
與前面介紹的簡單總線邏輯不同,CAN是一種復雜邏輯的總線結構。從層次上可以將 CAN 總線劃分為三個不同層次:
(1) 物理層在物理層中定義實際信號的傳輸方法,包括位的編碼和解碼、位的定時和同步等內容,作用是定義不同節點之間根據電氣屬性如何進行位的實際傳輸。在物理連接上,CAN總線結構提供兩個引腳:CANH和CANL,總線通過CANH和CANL之間的差分電壓完成信號的位傳輸。在不同系統中,CAN總線的位速率不同;在系統中,CAN總線的位速率是唯一的,并且是固定,這需要對總線中的每個節點配置統一的參數。
(2) 傳輸層傳輸層是CAN總線協議的核心。傳輸層負責把接收到的報文提供給對象層,以及接收來自對象層的報文。傳輸層負責位的定時及同步、報文分幀、仲裁、應答、錯誤檢測和標定、故障界定。
(3) 對象層在對象層中可以為遠程數據請求以及數據傳輸提供服務,確定由實際要使用的傳輸層接收哪一個報文,并且為恢復管理和過載通知提供手段。
5 CAN總線的報文結構
CAN 總線上的報文傳輸由以下 4 個不同的幀類型表示和控制。
(1) 數據幀
數據幀攜帶數據從發送器至接收器。總線上傳輸的大多是這種幀。從標識符長度上,又可以把數據幀分為標準幀(11 位標識符)和擴展幀(29 位標識符)。
數據幀由 7 個不同的位場組成:幀起始、仲裁場、控制場、數據場、CRC場、應答場、幀結束。其中,數據場的長度為0~8個字節。標識符位于仲裁場中,報文接收節點通過標識符進行報文濾波。幀結構如圖所示
(2) 遠程幀
由總線上的節點發出,用于請求其他節點發送具有同一標識符的數據幀。當某個節點需要數據時,可以發送遠程幀請求另一節點發送相應數據幀。與數據幀相比,遠程幀沒有數據場,結構如圖所示。
(3) 錯誤幀
任何單元,一旦檢測到總線錯誤就發出錯誤幀。錯誤幀由兩個不同的場組成,第一個場是由不同站提供的錯誤標志的疊加(錯誤標志),第二個場是錯誤界定符。
(4) 過載幀
過載幀用于在先行的和后續的數據幀(或遠程幀)之間提供附加延時。過載幀包括兩個場:過載標志和過載界定符。
6 CAN接口配置
在 Linux 系統中,CAN總線接口設備作為網絡設備被系統進行統一管理。在控制臺下,CAN總線的配置和以太網的配置使用相同的命令。
? ? ? 在上面的結果中,eth0 和 eth1 設備為以太網接口,can0 設備為 CAN 總線接口。接下來使用 ip 命 令來配置 CAN 總線的位速率:
ip link set can0 type cantq 125 prop-seg 6phase-seg1 7 phase-seg2 2 sjw 1ip link set can0 type can bitrate 500000 triple-sampling onifconfig can0 up cansend can0 145#1122334455667788candump can0當設置完成后,可以通過下面的命令查詢 can0 設備的參數設置:
ip -details link show can07?代碼??
/*1.報文發送程序*/#include#include#include#include#include#include#include#include#includeint main(){ int s,nbytes; struct sockaddr_can addr; struct ifreq ifr; struct can_frame frame[2] = {{0}}; s = socket(PF_CAN, SOCK_RAW, CAN_RAW);//創建套接字 strcpy(ifr.ifr_name, "can0"); ioctl(s, SIOCGIFINDEX, &ifr);//指定can0設備 addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; bind(s, (structsockaddr*)&addr, sizeof(addr));//將套接字與can0綁定 //禁用過濾規則,本進程不接收報文,只負責發送 setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); //生成兩個報文 frame[0].can_id = 0x11; frame[0].can_dlc = 1; frame[0].data[0] = 'Y'; frame[0].can_id = 0x22; frame[0].can_dlc = 1; frame[0].data[0] = 'N'; //循環發送兩個報文 while(1) { nbytes = write(s,&frame[0], sizeof(frame[0]));//發送frame[0] if(nbytes! = sizeof(frame[0])) { printf("Send Error frame[0]\n!"); break;//發送錯誤,退出 } sleep(1); nbytes = write(s,&frame[1], sizeof(frame[1]));//發送frame[1] if(nbytes != sizeof(frame[0])) { printf("SendErrorframe[1]\n!"); break; } sleep(1); } close(s); return0;}/*2.報文過濾接收程序*/#include#include#include#include#include#include#include#include#includeint main(){ int s,nbytes; struct sockaddr_can addr; struct ifreq ifr; struct can_frame frame; struct can_filter rfilter[1]; s = socket(PF_CAN, SOCK_RAW, CAN_RAW);//創建套接字 strcpy(ifr.ifr_name, "can0"); ioctl(s, SIOCGIFINDEX, &ifr);//指定can0設備 addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; bind(s,(struct sockaddr*)&addr, sizeof(addr));//將套接字與can0綁定 //定義接收規則,只接收表示符等于0x11的報文 rfilter[0].can_id=0x11; rfilter[0].can_mask = CAN_SFF_MASK; //設置過濾規則 setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter)); while(1) { nbytes = read(s, &frame, sizeof(frame));//接收報文 //顯示報文 if(nbytes>0) { printf("ID=0x%XDLC=%ddata[0]=0x%X\n",frame.can_id, frame.can_dlc,frame.data[0]); } } close(s); return 0;}總結
以上是生活随笔為你收集整理的linux can总线接收数据串口打包上传_【Linux应用】CAN总线编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSP201912-3化学方程式
- 下一篇: Linux中 安装一些实用小软件总结