技术博客

22/09/2015 作者 Troy

设置CANlib:基础API调用

这是CANlib开发3篇系列文章的第二篇:

简介

在上一个视频中,我们建立了如何将CANlib SDK资源添加到您自己的Visual Studio项目中。在本视频中,我们将介绍通过Kvaser设备从CAN总线配置和读取报文的最少的CANlib函数调用。我们已经从上一个视频中向示例项目添加了必要的代码。此代码将配置设备或虚拟通道为250 kbps,然后循环,读取总线上的每个CAN帧,直到用户按下退出按钮。

示例

为了实现这一点,我们在上一个视频中描述的第一步是使用“using”指令导入canlibCLSNET类型。

我们的第一个CANlib函数调用必须是canInitalizeLibrary。调用此函数会将必要的DLL加载到内存中,并为所有连接的Kvaser硬件分配一个通道号。

我们现在需要使用canOpenChannel函数来处理Kvaser CAN电路。返回的句柄对于对库的后续调用是必要的。第一个参数指定所需的CAN电路。 第二个参数允许附加限定标志。在这种情况下,我们接受虚拟通道的句柄。

现在我们有一个句柄,我们可以为连接的CAN总线配置电路适当的比特率。canSetBusParams函数支持设置每个总线参数值或使用Kvaser的预定义比特率中的某一个。我们使用的预定义比特率为250 kbps

一旦配置了比特率,就可以通过调用canBusOn使电路在CAN总线上激活。 一旦该功能执行,CAN电路正在积极地参与CAN流量。

您可能已经注意到,在每次调用CANlib函数后调用DisplayError。对于更简洁的代码,我们在独立的函数中处理从CANlib返回的错误状态。如果存在错误条件,我们使用canGetErrorText函数将错误代码转换为字符串描述。检查CANlib函数返回的状态对于确认发生问题的位置至关重要。

在Main中,我们已经完成了配置和激活电路,因此我们可以从总线循环读取CAN帧。我们将使用canReadWait来检索CAN帧。CAN帧由标识符(id),0至8个数据字节(数据),数据长度代码(dlc),消息属性(标志)和时间戳(时间)组成。如果接收缓冲区为空,canReadWait中的最终参数将指定CAN帧等待的以毫秒为单位的时间长度。所以,当canReadWait返回时,我们需要检查一些事件,然后才假设我们有一个报文。如果返回的状态值是canOK,我们知道我们有事件要处理。如果返回的状态是canERR_NOMSG,那么我们只需要再次循环。 但是如果返回的状态是任何其他值,则电路的句柄不能再用于读取CAN数据。

再次,为了使代码更容易读取,我们将数据处理代码放在一个单独的函数DisplayMessage中,当canReadWait返回canOK状态时执行该函数。DisplayMessage显示了可以从返回的CAN帧数据中提取的许多信息。但最重要的是,该函数检查第二个指示符是否接收到实际的CAN数据帧。这是通过检查flags参数中的canMSG_ERROR_FRAME位来完成的。如果该位被置位,您收到错误帧,并且不处理标识符、数据长度代码或数据参数。如果该位未被置位,您就已收到一个CAN数据帧,并应根据需要处理该帧。

一旦完成,您应该通过使用canBusOff函数使总线上的CAN电路无效,然后使用canClose函数释放句柄来正常关闭程序。

现在让我们运行我们新的控制台应用程序,并实时对其工作进行查看。如你所见,应用程序能够连接到设备,开始接收CAN帧,并处理它们,直到我们按Escape退出。

更多信息

有关CANlib的更多信息,您可以查看我们的CANlib SDK帮助,并查看我们的技术博客中的系列文章。

Author Image

Troy Via

Troy Via是Kvaser股份有限公司的软件和支持工程师。Troy为Kvaser编写了多个培训视频,是产品开发团队的关键成员。他也代表Kvaser参加NMEA讨论。工作之余,他还是一名狂热的游戏玩家。