![05c3035c645cca9a4cbbdbf58154ebae.png](https://i-blog.csdnimg.cn/blog_migrate/507d1b64a4c103ccede380f0b911ae30.jpeg)
概述
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的一些常见问题。
安装部分
1.PCAN basic API支持哪些操作系统?
Windows 10/8/7/Vista,Linux驱动可在网页下载:www.peak-system.com/linux
2.使用PCAN basic API还需要安装其它东西吗?
是的,您需要在安装PEAK驱动的时候勾选PCAN-Basic,注意默认的条件下它是未勾选状态。
建议的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接口卡都是可即插即拔的,只需要两个参数。
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](https://i-blog.csdnimg.cn/blog_migrate/cf024e65e84a9eb1ee6307d779df86e2.png)
在有通道没被释放的时候,选择PCAN-Basic API选项卡,选择需要的通道然后点击左下角的Reset可以手动释放通道。
2).重启编程软件或重启电脑。
以下方法
可能让问题不再发生:
禁用编译器在调试(debug)时的托管进程,以C#为例(VS2017以后的版本不再有这个选项):
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
↓↓↓