在現(xiàn)有的can_api.h所提供的接口函數(shù)的基礎(chǔ)上,推出CAN接口通訊一些擴展應(yīng)用功能,主要是為每個接收的數(shù)據(jù)包均加上了時間標(biāo)簽,以支持實時控制的應(yīng)用。為了兼容以前接口函數(shù),can_api.h保持不變,英創(chuàng)公司另外定義了一個can_api_ex.h,在該文件中定義了帶有時間標(biāo)簽的CAN數(shù)據(jù)報文結(jié)構(gòu)。
typedef struct
{
// CAN數(shù)據(jù)報文ID,其中
bit 0-28 : CAN identifier (11/29 bit)
bit 29 : error frame flag (0 = data frame, 1 = error frame)
bit 30 : remote transmission request flag (1 = rtr frame)
bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
DWORD dwCAN_ID;
// CAN數(shù)據(jù)報文中的數(shù)據(jù)長度
DWORD dwCAN_DatLen;
// CAN數(shù)據(jù)報文中的數(shù)據(jù)
UCHAR ucDat[8];
// CAN數(shù)據(jù)報文的時間標(biāo)簽,單位為毫秒
DWORD dwTimeTick;
} CAN_FRAME, *PCAN_FRAME;
獲取帶有時間標(biāo)簽的CAN接收報文,可通過調(diào)用標(biāo)準(zhǔn)的ReadFile( ) 來實現(xiàn),相應(yīng)的發(fā)送函數(shù)也可調(diào)用WriteFile( )來處理。以下為接收線程中的獲取帶有時間標(biāo)簽的CAN數(shù)據(jù)報文的方法:
WaitForSingleObject( ceCAN->m_hRxEvent, 15 );
{
dwLen = 0;
bResult = ReadFile(ceCAN->m_hCAN,
&ceCAN->can_frame,
sizeof(CAN_FRAME), &dwLen, NULL );
if( dwLen==sizeof(CAN_FRAME) ) // receive a can frame
{
if( dwLastTimeTick == 0 )
{
printf( '0x%08x - %ld\n', ceCAN->can_frame.dwCAN_ID, ceCAN->can_frame.dwTimeTick );
dwLastTimeTick = ceCAN->can_frame.dwTimeTick;
}
else
{
printf( '0x%08x - %ld\n', ceCAN->can_frame.dwCAN_ID, ceCAN->can_frame.dwTimeTick-dwLastTimeTick );
dwLastTimeTick = ceCAN->can_frame.dwTimeTick;
}
}
}
經(jīng)過測試,在英創(chuàng)嵌入式主板上CAN時間標(biāo)簽的精度能夠保證在±1ms。
由于讀取帶有時間標(biāo)簽的CAN數(shù)據(jù)報文采用的是系統(tǒng)標(biāo)準(zhǔn)函數(shù)ReadFile,所以對該擴展功能感興趣的老客戶,需要對已有的英創(chuàng)嵌入式主板WinCE內(nèi)核進(jìn)行升級,而can_api.lib不需做任何變化。具體can_api.h中定義的接口函數(shù)參見《基于SJA1000的CAN通訊接口函數(shù)使用說明》一文。
感興趣的客戶可以和英創(chuàng)的技術(shù)支持聯(lián)系。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35402
發(fā)布評論請先 登錄
相關(guān)推薦
評論