系列文章目錄
車載網絡測試實操源碼_使用CAPL腳本解析hex、S19、vbf文件
車載網絡測試實操源碼_使用CAPL腳本對CAN報文的Counter和CRC進行實時監控
車載網絡測試實操源碼_使用CAPL腳本模擬發送符合協議要求(Counter和CRC)的CAN報文
車載網絡測試實操源碼_使用CAPL腳本實現安全訪問解鎖
車載網絡測試實操源碼_使用CAPL腳本進行DTC自動化測試
車載網絡測試實操源碼_使用CAPL腳本進行UDS刷寫及其自動化測試
車載網絡測試實操源碼_使用CAPL腳本進行UDS協議測試
粉絲問題解答系列文章… …
其他持續更新中… …
文章目錄
- 系列文章目錄
- 前言
- 一、CAPL簡介
- 二、CAPL腳本示例
- 總結
前言
在車載軟件開發和測試過程中,我們經常會需要模擬發生CAN報文,特別是有些CAN報文按照協議要求是包含Counter和校驗碼(比如CRC、checksum等)的,這個時候如果使用普通的CAN工具發送固定不變的CAN報文,則不會被認為是有效的CAN報文。如何按照協議模擬counter遞增且校驗碼正確的報文呢?今天我們就來講一下如何使用CAPL腳本模擬發送符合協議要求(Counter和CRC)的CAN報文。
一、CAPL簡介
CAPL(Communication Access Programming Language)是一種基于C語言開發的編程語言,專門用于CANalyzer和CANoe工具環境。CAPL語言的主要特點包括:
語法結構:CAPL具有類C語言的語法結構,支持多種數據類型,如變量、常量、函數、結構和數組。但CAPL簡化了C語言,移除了復雜的指針概念和一些不常用的關鍵字,同時融入了一些C++的概念,如函數重載等。
特性:CAPL語言支持在對象和圖像之間使用可編程語言,可以在PC上進行測試,支持腳本語言,使用可復用的模塊,實時診斷和控制,以及豐富的圖形和可視化效果等。這些特性使得CAPL在系統開發中更加容易、高效、可靠和安全。
編譯過程:CAPL的編譯過程簡潔高效,因為CAPL瀏覽器僅對單個文件進行編譯,無需進行復雜的鏈接操作。與C語言編程相比,CAPL的開發過程更為直接和易于上手。在編譯階段,任何語法或語義的錯誤都會被檢測出來,并在CANalyzer和CANoe的專用“write窗口”中報告運行時錯誤,從而提高了調試的效率。
應用領域:CAPL特別適用于制動系統、壓縮機、氣體機械和其他復雜的實時控制系統應用程序。同時,由于CAPL語言的簡潔和高效,它也被廣泛應用于各種測試和分析任務中。
腳本執行:CAPL腳本是基于事件驅動的,沒有main函數和程序入口。任何時間都有可能觸發CAPL腳本的執行,如按鍵事件、定時器事件、執行測試等。如果沒有事件發生,那么CAPL程序是“閑置的”。
二、CAPL腳本示例
模擬發送符合協議要求(Counter和CRC)的CAN報文的CAPL腳本示例如下:
/*@!Encoding:936*/
includes
{}variables
{//示例CAN報文message can1.0x123 msg_can1_123 = {dlc = 8,BRS = 0,byte(0) = 0xAA,byte(1) = 0xBB,byte(2) = 0x12,byte(3) = 0x34,byte(4) = 0x56,byte(5) = 0x78,byte(6) = 0x00,byte(7) = 0x00};/*定時器*/msTimer timer_10ms;
}/*CRC8 校驗算法*/
byte crc_sae_j1850_zero(byte dataArry[] ,int length)
{byte crc;byte poly;int i = 0;int j = 0;crc = 0x00;poly = 0x1D;//可根據算法需要修改多項式for(i =0 ; i < length; i++){crc = crc ^ dataArry[i];for(j =0 ; j < 8; j++){if ((crc & 0x80) != 0){crc = (crc << 1) ^ poly;} else{crc = (crc << 1);} } crc &= 0xFF;}crc = crc ^ 0x00;return crc;
}/*CRC8 校驗預處理*/
byte CRCChecksum_calc(message * msg,byte crc_byte_idx,byte len)
{byte dataArray[64] ;byte crc;byte i;msg.byte(crc_byte_idx) = 0;//初始化CRC為0for(i = 0; i < len; i++){dataArray[i] = msg.byte(len-1-i);//顛倒字節序(按需)}crc = crc_sae_j1850_zero(dataArray,len);return crc;
}/*填充發送counter遞增、CRC正確的CAN報文*/
void sendValidMsg_InTimer(message * msg,byte counter_byte_idx,byte counter_add,byte crc_byte_idx)
{msg.Dlc = 8;msg.BRS = 0;msg.byte(counter_byte_idx) += counter_add;msg.byte(crc_byte_idx) = CRCChecksum_calc(msg,crc_byte_idx,8);output(msg);
}/*10ms周期定時器*/
on timer timer_10ms
{sendValidMsg_InTimer(msg_can1_123,6,0x10,7);//byte6為counter,每次遞增0x10;byte7為CRCsetTimer(timer_10ms,10);
}/*啟動發送示例*/
on key 'a'
{setTimer(timer_10ms,0);
}/*停止發送示例*/
on key 'b'
{cancelTimer(timer_10ms);
}
以上是模擬發送符合協議要求(Counter和CRC)的CAN報文的CAPL腳本示例,可根據需要修改CRC校驗算法,或者改為checksum校驗和算法等。按下按鍵’a’后啟動發送CAN報文,按下按鍵’b’后停止發送CAN報文,效果如下:
總結
本文簡單介紹了如何使用CANoe+CAPL腳本模擬發送符合協議要求(Counter和CRC)的CAN報文,希望對大家有所幫助。各位可根據本文的示例,結合自己的需求,進行完善和二次開發。