设置CANlib：基础API调用

Troy
Tue, 22 Sep 2015 20:48:05 +0000

http://v.youku.com/v_show/id_XMTUzNDA2OTIwMA==.html

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

1. 在Visual Studio中设置CANlib

2. 基础API调用

3. 事件驱动应用程序

简介

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

示例

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

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

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

现在我们有一个句柄，我们可以为连接的CAN总线配置电路适当的比特率。canSetBusParams函数支持设置每个总线参数值或使用云海游戏的预定义比特率中的某一个。我们使用的预定义比特率为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退出。

更多信息