整理一下研究生第一年學到的東西,因為研究方向是和無人車相關,最先學習的就是can匯流排的相關知識了,這裡簡單地po乙個筆者利用c/c++寫的乙個can的使用模板。
can的全稱是controller area network是一種車內常用的通訊協議,網路的裝置直接互聯通訊。[1]基本上,現在很多車都是使用can協議作為車內ecu與各個模組之間的通訊手段。這些協議的具體格式:例如它們的時間間隔、幀的每一位是什麼含義,傳送方和接收方是誰、怎樣解讀等等,各個車廠各有不同,還沒有形成乙個統一的標準。而且這些協議車廠不會輕易公開,否則非常容易被人直接控制車輛或者獲取車輛的行駛資料。
對於我們來說,直接利用can協議進行改造是一件最為輕鬆的事情,因為我們只需要拿到can的協議內容,再利用can分析儀和簡單電路修改,就可以選擇遮蔽掉車內原來的can的線路,轉而使用我們通過**發出的指令到各個執行部分,例如esp、acc等等。
這一部分,可以參考 這篇文章,講的非常詳細,這裡筆者就簡單地概括了一下:
分為資料幀、遠端幀、錯誤幀、過載幀和幀間隔。其中我們一般使用的都是資料幀。乙個資料幀包括了幀起始、仲裁段、控制段、資料段、crc段、ack段、幀結束這幾個部分,具體的命令含義都是集中在資料段,傳輸的資料量是8個byte(64個bit)。
can分析儀如下圖所示,一般來說是usb轉can,一台can分析儀可以插兩個channel。
配套使用的在ubuntu或者樹莓派下面需要有libcontrolcan.so,通常在聯絡賣家的時候可以讓其針對你的工控機或者其他控制裝置的os進行發貨,得到之後需要將.so放在目錄下,能夠鏈結到。
class
control
#include "control.h"
/** *@func control::control()
*@brief default constructor of class control
*@details set the can sturcture information such as can index.
*/control::control()
/** *@func control::~control()
*@brief default destructor of class control
*@details close can device.
*/control::~control()
int control::startdevice()
/*初始 can*/
vic_1.acccode = 0x80000008;
vic_1.accmask = 0xffffffff;
vic_1.filter = 1;
vic_1.timing0 = 0x00;
vic_1.timing1 = 0x1c;
vic_1.mode = 0;
dwrelvci_initcan = vci_initcan(ndevicetype, ndeviceind, ncanind_1, &vic_1);
if (dwrelvci_initcan != 1)
if (vci_startcan(ndevicetype, ndeviceind, ncanind_1) != 1)
vci_clearbuffer(ndevicetype, ndeviceind, ncanind_1);
return1;}
int control::closedevice()
return
1;}
[1]
[2]
利用CoreAnimation實現乙個時間的進度條
那麼接下來就是如何用coreanimation實現乙個進度條控制項了。首先呢,讓我們建立乙個繼承自cashapelayer的wkprogressbarlayer。wkprogressbarlayer預設自身的bounds就是整個進度條的大小。inte ce wkprogressbarlayer ca...
利用CoreAnimation實現乙個時間的進度條
那麼接下來就是如何用coreanimation實現乙個進度條控制項了。首先呢,讓我們建立乙個繼承自cashapelayer的wkprogressbarlayer。wkprogressbarlayer預設自身的bounds就是整個進度條的大小。inte ce wkprogressbarlayer ca...
利用boost asio實現乙個簡單的伺服器框架
boost asio是乙個高效能的網路開發庫,windows下使用iocp,linux下使用epoll。與 不同的是,它並沒有提供乙個網路框架,而是採取元件的方式來提 用介面。但是對於常見的情況,採用乙個好用的框架還是能夠簡化開發過程,特別是asio的各個非同步介面的用法都相當類似。受到 sp se...