广告招募

当前位置:全球资源网 > 技术中心 > 所有分类

CAN手柄vs通道号

2025年11月12日 10:03:54      来源:广州智维电子科技有限公司 >> 进入该公司展台      阅读量:0

分享:

在撰写”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", stat);
}
View sourceCopy to clipboard

这将返回一个可以是任何非负数的句柄(在次调用它时通常为零)。手柄稍后会被用到,如当读取下一个可用的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", stat);
}
View sourceCopy to clipboard

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

我建议我们应该养成习惯将句柄声明为CanHandle(而不是int),从而清楚地标记句柄。在此建议的同时,也鼓励大家始终检查返回状态,就像上面对canRead() 所做的那样。当出现错误时,这将有助于缩短调试时间。
版权与免责声明:
1.凡本网注明"来源:全球资源网"的所有作品,版权均属于全球资源网,转载请必须注明全球资源网。违反者本网将追究相关法律责任。
2.企业发布的公司新闻、技术文章、资料下载等内容,如涉及侵权、违规遭投诉的,一律由发布企业自行承担责任,本网有权删除内容并追溯责任。
3.本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。 4.如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系。