开发常见问题_PCAN二次开发常见问题汇总

05c3035c645cca9a4cbbdbf58154ebae.png

概述

PCAN basic API是一个用于连接PCAN硬件的编程接口,支持多种编程语言进行二次开发。用户可以将API的文件与PEAK的硬件配套使用,但是不能用于其它任何第三方硬件。

PCAN-Basic API也提供了C#, C++/MFC, C++/CLR,C++_Builder, Delphi, VB.NET, Java, and Python等的例程。

同时,基于PCAN-Baisc API,通过我们提供的CCP/XCP,ISO TP,UDS,OBD等API还可以开发诊断和标定方面的软件,后面也会讲到关于UDS的一些常见问题。

c384c2a0fb761cfd33ecdf5077d90acc.png

安装部分

1.PCAN basic API支持哪些操作系统?

Windows 10/8/7/Vista,Linux驱动可在网页下载:www.peak-system.com/linux

2.使用PCAN basic API还需要安装其它东西吗?

是的,您需要在安装PEAK驱动的时候勾选PCAN-Basic,注意默认的条件下它是未勾选状态。

3603393e7ee4e15be868aa2071209718.png 建议的DLL拷贝位置 使用dll文件的时候,建议把dll文件拷贝到如下位置,方便调用。 32位系统:32Bit DLLs > Windows\system32 64位系统:32bit DLLs > Windows\syswow64 64bit DLLs > Windows\system32 连接部分 3.如果我的程序无法发送/接收报文,首先应该确认什么? 首先还请检查物理接线,比较快速的方法是通过免费软件PCAN VIEW,如果PCAN VIEW收发是正常的,说明问题出在程序上;否则应该检查接线。 4.PCAN VIEW和我编写的程序能够同时连接同一个硬件吗? 可以的。二次开发的程序可以和PCAN VIEW连接同一通道上,这个时候可以用PCAN VIEW打开一个trace界面,可以比较方便的进行debug,区分问题出在硬件上还是软件上。 函数部分 5.用API进行CAN通信的流程是怎样的? 最简单的通信只需要三个步骤:初始化,读写CAN报文,断开设备。 6初始化函数CAN_Initialize的输入参数应该怎么填写? 初始化函数是重载函数,对于不同的硬件,需要输出的参数也是不同的,请务必注意。 区分该使用哪个函数的办法是利用PCAN硬件是否是可以即插即拔的硬件,可即插即拔的硬件只需要输入两个参数,而非即插即拔的硬件需要5个。常用的PCAN USB和PCI接口卡都是可即插即拔的,只需要两个参数。 ed60e0ada56cef777be50f97022644fd.png 7. TPCANHandle如何对应每个硬件? 除了区分硬件类型外,相同类型的硬件通过插入PC的顺序判断先插入的就是小号,比如,第一个插入的PCAN USB设备的第一个通道就是PCAN_USBBUS1。之后是同一个设备的其它通道,之后是第二个插入的设备的通道,以此类推。 8. TPCANBaudrate如何输入? CAN总线上所有节点波特率一致才能良好地进行通信。该参数一般按照头文件定义的默认值进行使用即可。 特殊情况下,如果您需要不常用的波特率值或是更改采样点位置,这个参数可以直接用于给定BTR0BTR1寄存器的值。 9.初始化失败可能是什么原因?初始化一直提示通道被占用该怎么办? 除了参量设置错误或者其他软件(PCAN VIEW,PCAN Explorer5/6)占用以外,最常见的初始化失败错误来自上次程序没有运行到Uninitialize就被强制停止了,这种情况下没办法再次进行初始化。Debug的过程中比较常遇见。 解决方法: 1).关闭出现问题的程序,将硬件设备和PC断开,然后再次连接。 2).在连接设备前加一段代码将所有PEAK硬件通道断开,方法是使用CAN_Uninitialize函数,输入参数是PCAN_NONEBUS。(这种办法是否生效,取决于编程语言和编译器) 如果重新插拔设备依然不能解决问题,说明编译器的debug模式没有自动释放PCAN通道。以下方法可以手动释放通道: 1).将PCAN驱动升级到4.2.0(及以上)版本,用WIN+R快捷键启动运行界面,输入peakcpl。 c3beb3c097d9e312df2ccb8255b4cfec.png 在有通道没被释放的时候,选择PCAN-Basic API选项卡,选择需要的通道然后点击左下角的Reset可以手动释放通道。 2).重启编程软件或重启电脑。 以下方法可能让问题不再发生: 禁用编译器在调试(debug)时的托管进程,以C#为例(VS2017以后的版本不再有这个选项): a1b63b485e7bff53c4bb01f998a6cbd6.png 10.为什么初始化,读,写的函数各自有两个,一个有FD,一个没有FD? 带FD的函数用于支持CAN FD的硬件,由于CAN FD和普通CAN2.0使用不同的芯片,所以初始化需要使用不同的函数。只有使用带有FD的初始化函数,才能用带有FD的读和写函数进行CAN FD格式的报文收发。这两组函数绝对不能混用,请注意。 11.CAN FD的初始化函数,TPCANBitrateFD是怎么填写的? CAN FD初始化时,波特率输入参数是一个字符串,里面给出的所有变量就是用于计算波特率使用的。 您可以参考我们微信公众号的文章: CAN波特率计算 或者直接联系我们的技术人员,告知需要设置的波特率之后,我们可以告诉您该怎么设置。 12.Read函数是只能一次读取一帧吗?我应该怎么使用它来读取? 是的,Read函数每次会从硬件设备的缓存中读取最早收到的一帧,因此不用担心单帧读取的时候会出现丢帧的情况,缓存总共可以存储32767帧,如果程序读取太慢的话,缓存满了之后就会开始丢帧,请注意。Read函数读取并不能保证是实时的数据,除非您读取的速度足够快,有时间戳可以说明收到的时间。 我们推荐的读取方法是依靠TPCANStatus这个函数返回值,当返回PCAN_ERROR_QRCVEMPTY时说明缓存中的帧已经被读完,我们可以在每次要读取的时候循环读到出现这个返回值,这样就不会丢帧了。 另外TPCANParameter里面的PCAN_RECEIVE_EVENT和PCAN_RECEIVE_STATUS两个参数,也会对读取有帮助,前一个参数可以用于设置事件触发,后一个参数可以让硬件暂时把收到的CAN报文只能丢弃,而不存入缓存。推荐使用事件触发的方式进行读取,请参考PEAK提供的官方例程。 13.Write函数为什么没有时间戳? 是的,Write函数不提供时间戳信息,PEAK的工程师推荐使用WIN API里面的QueryPerformanceCounter函数获取时间戳。 请参考: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx 14.可以通过CAN_FilterMessages函数多次进行报文过滤吗?为什么有时候报文过滤失败了? 是的,只要多次调用这个函数就可以用于扩展过滤器,但是请注意,11位ID的过滤和29位ID的过滤不能混用。这是由于这个函数是在使用CAN控制器(SJA1000)的硬件过滤功能。同样的,因为硬件的限制,在29位ID的过滤上,很容易出现收到不想要的报文的情况,这种时候只能在软件层面进行过滤。 关于详细信息,请查看如下文档的章节4.1.2: https://www.nxp.com/docs/en/application-note/AN97076.pdf ↓↓↓
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值