UDS學習筆記(二)——硬件的搭建以及配置開發環境

網上上對CAN總線的介紹很多,對於CAN總線的介紹就到這了。接下來是對硬件的搭建。前文說過了硬件使用的是樹莓派與MCP2515模塊。

MCP2515模塊

MCP2515是一個CAN總線控制器,其實上面還集成了一個CAN收發器。但是由於MCP2515佔主要功能(將SPI總線擴展稱CAN總線),因此我們就暫且叫它MCP2515模塊吧。

MCP2515模塊

樹莓派

樹莓派是一個基於Linux系統的卡片型電腦,相對於單片機來說,它的性能是非常強大的。樹莓派上有40個引腳可以用來擴展一些外部設備。樹莓派上沒有自帶CAN總線的,但是可以通過SPI接口,通過MCP2515模塊擴展出一個CAN總線處理。因此需要將是,樹莓派的SPI總線與模塊的SPI總線相連。網上也有很多配置樹莓派的CAN通訊文章。參考文章:微雪電子

功能引腳 樹莓派(BCM) 描述
3.3V 3.3V 3.3V電源正
GND GND 電源地
SCK SCK SPI時鐘
MOSI MOSI SPI數據輸入
MISO MISO SPI數據輸出
CS CS 片選信號
INT 25 中斷接口

配置開發環境

在連接好硬件線之後之後,通過以下可以查看內核是否正確加載好模塊。

dmesg | grep -i '\(can\|spi\)'

接下來就是配置開發環境了。首先是安裝Python-CAN模塊。這個模塊非常有用。通過官方文檔我們可以看到,它支持非常多種的CAN設備。例如: SocketCANKvaser’s CANLIBCAN over SerialCAN over Serial / SLCANIXXAT Virtual CAN InterfacePCAN Basic APIUSB2CAN InterfaceNI-CANisCANNEOVI InterfaceVectorVirtualCANalyst-IISYSTEC interface。市場上大部分的CAN設備都能使用。我們這次使用的是SocketCAN,Linux 提供了SocketCAN 接口,使得 CAN 總線通信近似於和以太網的通信,應用程序開發接口 更加通用, 也更加靈活。

本次開發主要使用的是基於Python的UDS。爲什麼要選擇Python語言呢?首先就是C語言需要根據平臺的不同需要編譯,而不同平臺對CAN接口的定義都是不一樣的。調用方式都可能有很大的不同。而Python就不一樣了。使用Python-CAN模塊能跨平臺開發,這樣我們在window上寫好的代碼,只需要複製就能移植到Linux平臺。如果只想快速開發,學習通信協議,並不想糾結與C語言代碼的調試,那麼Python是最好的選擇了。

在安裝好udsoncan之後,我們就官方例程進行中文註釋一下吧。

import SomeLib.SomeCar.SomeModel as MyCar #導入一個汽車模型配置

import udsoncan #導入uds庫
from udsoncan.connections import IsoTPSocketConnection  #從uds庫中導入連接方式
from udsoncan.client import Client #從uds庫中導入客戶端
from udsoncan.exceptions import * #從uds庫中導入出錯方式
from udsoncan.services import * #從uds庫中導入服務列表
udsoncan.setup_logging()  #開始記錄數據

conn = IsoTPSocketConnection('can0', rxid=0x123, txid=0x456)  #設置連接端口爲can0,接受數幀id,發送幀id
with Client(conn,  request_timeout=2, config=MyCar.config) as client:#初始化客戶端,注意要加載配置文件
   try:
      client.change_session(DiagnosticSessionControl.Session.extendedDiagnosticSession)  # 將控制器改爲擴展會話
      client.unlock_security_access(MyCar.debug_level)   # Fictive security level. Integer coming from fictive lib, let's say its value is 5 安全驗證
      client.write_data_by_identifier(udsoncan.DataIdentifier.VIN, 'ABC123456789')   #修改汽車的VIN號    # Standard ID for VIN is 0xF190. Codec is set in the client configuration
      print('Vehicle Identification Number successfully changed.')
      client.ecu_reset(ECUReset.ResetType.hardReset)  # 重啓ECU
   except NegativeResponseException as e:
      print('Server refused our request for service %s with code "%s" (0x%02x)' % (e.response.service.get_name(), e.response.code_name, e.response.code))
   except InvalidResponseException, UnexpectedResponseException as e:
      print('Server sent an invalid payload : %s' % e.response.original_payload)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章