CAN手柄 vs 通道号

Magnus Carlsson
Wed, 03 Jun 2015 17:22:12 +0000

在撰写”CANlib通道号还是卡号？“一文时，有用户评论要求阐明CanHandle和通道号之间的区别，因为它们都可从零开始。

CAN通道使用CANlib中的canOpenChannel()函数打开，将通道号作为第一个参数。

CanHandle handle;
canStatus stat;

int canLibChannelNumber = 0;

handle = canOpenChannel(canLibChannelNumber, canOPEN_ACCEPT_VIRTUAL);
if (handle < 0) {
  printf("canOpenChannel failed, status=%d\n", stat);
}

这将返回一个可以是任何非负数的句柄（在第一次调用它时通常为零）。手柄稍后会被用到，如当读取下一个可用的CAN报文时。如果调用tocanOpenChannel()失败，将返回负错误代码，而不是有效的句柄。

long id;
unsigned char data[8];
unsigned int dlc, flags;
unsigned long timestamp;

stat = canRead(handle, &id, data, &dlc, &flags, &timestamp);
if (stat != canERR_NOMSG) {
  printf("Failed, status == %d\n", stat);
}

句柄是内部的正数，不能手动编辑。如前所述，CANlib中返回的CanHandle可能与通道号混淆，但新版库，如kvrlib，则会返回一个更大更随机的数字，以降低混淆的风险。

我建议我们应该养成习惯将句柄声明为CanHandle（而不是int），从而清楚地标记句柄。在此建议的同时，也鼓励大家始终检查返回状态，就像上面对canRead() 所做的那样。当出现错误时，这将有助于缩短调试时间。