在现有的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通讯接口函数使用说明》一文。
感兴趣的客户可以和英创的技术支持联系。
全部0条评论
快来发表一下你的评论吧 !