在現有的can_api.h所提供的接口函數的基礎上,推出CAN接口通訊一些擴展應用功能,主要是為每個接收的數據包均加上了時間標簽,以支持實時控制的應用。為了兼容以前接口函數,can_api.h保持不變,英創公司另外定義了一個can_api_ex.h,在該文件中定義了帶有時間標簽的CAN數據報文結構。
typedef struct
{
// CAN數據報文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數據報文中的數據長度
DWORD dwCAN_DatLen;
// CAN數據報文中的數據
UCHAR ucDat[8];
// CAN數據報文的時間標簽,單位為毫秒
DWORD dwTimeTick;
} CAN_FRAME, *PCAN_FRAME;
獲取帶有時間標簽的CAN接收報文,可通過調用標準的ReadFile( ) 來實現,相應的發送函數也可調用WriteFile( )來處理。以下為接收線程中的獲取帶有時間標簽的CAN數據報文的方法:
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;
}
}
}
經過測試,在英創嵌入式主板上CAN時間標簽的精度能夠保證在±1ms。
由于讀取帶有時間標簽的CAN數據報文采用的是系統標準函數ReadFile,所以對該擴展功能感興趣的老客戶,需要對已有的英創嵌入式主板WinCE內核進行升級,而can_api.lib不需做任何變化。具體can_api.h中定義的接口函數參見《基于SJA1000的CAN通訊接口函數使用說明》一文。
感興趣的客戶可以和英創的技術支持聯系。
-
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35579
發布評論請先 登錄
相關推薦
評論