技术博客

22/04/2015 作者 Jerry Thorsén

使用对象缓冲

我们的一些分析仪配备了用于自动发送或响应报文的硬件缓冲。它们可以在时序条件严格的情况下使用,并且可能无法在应用程序级别上实现。

通常,由Kvaser单元中的CAN驱动程序接收到的CAN报文必须通过USB或PCI端口传送到计算机。在应用程序处理之前,必须通过操作系统并由驱动程序接收。现在,它并不像传闻中的那么慢,但有时候还不够快。那此时就是Kvaser对象缓冲发挥作用的时候了,它可用来解决这些步骤造成的延迟。

我们有两种类型的对象缓冲:自动响应自动传送

  • 自动响应是在收到符合条件的报文后立即发送定义的报文。
  • 自动传送是定期发送报文,时间精度高于通过驱动程序和操作系统运行的应用程序所能实现的。

使用对象缓冲

情况1:自动响应

要使用对象缓冲,首先要分配一个调用canObjBufAllocate()的缓冲。

对于自动响应缓冲,你可以通过canObjBufSetFilter()函数定义要响应的报文,并使用canObjBufWrite()函数设置响应的内容。

要启用缓冲,请调用canObjBufEnable()函数,并调用canObjBufDisable()函数来禁用它。

canObjBufSetFilter()中的过滤器是掩码和代码类型,这意味着你可以设置缓冲以响应一系列CAN标识。更多信息,请查看此帮助文档

示例代码:

此代码段设置一个响应CAN ID100的缓冲,其带有ID为200的报文。

 /* Set up an auto response buffer */


byte[] msg = { 1, 2, 3, 4, 5, 6 }; //define message
int autoBufIndex = (int)(canObjBufAllocate(handle, canOBJBUF_TYPE_AUTO_RESPONSE)); //Allocate buffer
int status;
status = canObjBufWrite(handle, autoBufIndex, 200, msg, 0, 0); //Write to buffer
status=  canObjBufSetFilter(handle, autoBufIndex, 100, 0xFFFF); //Only match message with id 100, match on all bits.        
status = canlibCLSNET.Canlib.canObjBufEnable(handle, autoBufIndex); //activate the buffer
            

情况2:自动传送

再次,要使用对象缓冲,首先从调用canObjBufAllocate()函数分配一个缓冲。

对于自动传送缓冲,调用canObjBufSetPeriod()函数来设置报文的频率,调用canObjBufSetMsgCount()函数来设置从缓冲发送的报文数,并调用canObjBufWrite()函数定义报文的内容。

示例代码:

该代码段设置一个自动发送缓冲,发送ID为300的报文,间隔为1ms。

/* Set up an auto transmit buffer */

byte[] msg = { 1, 2, 3, 4, 5, 6 }; //define message
int autoBufIndex = (int)(canObjBufAllocate(handle, canOBJBUF_TYPE_AUTO_TRANSMIT)); //Allocate buffer
int status;
status = canObjBufWrite(handle, autoBufIndex, 300, msg, 0, 0); //Write to buffer
status = canObjBufSetPeriod(handle, autoBufIndex, 1000); //Set period to 1000 microseconds
status = canlibCLSNET.Canlib.canObjBufEnable(handle, autoBufIndex); //activate the buffer
            

哪些分析仪有对象缓冲功能?

我们的Professional专业系列产品里有硬件对象缓冲功能,通常有8个缓冲区可用。

搜索Professional专业系列产品 >>

如果您有任何意见,请发送邮件至support@kvaser.com和我们取得联系。

Author Image

Jerry Thorsén