本文主要讲的是,基于TSMaster 实现TOSUN 系列/CANFD,LIN 设备的操作。主要给大家介绍在 TSMaster 软件里如何实现CAN 信号 收发 Demo工程。
关于Demo工程
简要描述:
VB6.0 编程 语言调用libTSCAN 接口 实现 硬件 扫描、连接、CAN报文单帧发送、周期发送、报文接收,报文过滤。
典型应用需求:
对于现在还在维护和开发的VB项目工程需要调用TSCAN硬件实现报文收发等业务。
技术背景
在 VB6.0中使用 Declare 语句声明libTSCAN.dll中的函数,这些声明使得 VB6.0能够与底层的 A进行交互。如:Private Declare Funcon tscan_connect Lib "libTSCAN.dll" (ByValeviceSerial As String, ByRef AHandle As Long) As Long。
Demo工程实现
添加库文件
要实现对 TOSUN 系列 CAN/CANFD,LIN 设备的操作,需要基于 libTSCAN.dll ,libTSH.dll,binlog.dll 以及 liblog.dll动态链接库文件。它们之间依赖关系如下图1所示。
libTSCAN.dll ,libTSH.dll,binlog.dll 以及 liblog.dll动态链接库文件文件位置可以在TSMaster安装目录下获取。C:\ProgFiles (x86)\TOSUN\TSMaster\Data\K\examples\\\lib\libTOSUN\windows\x86
新建好VB工程后将以上依赖文件添加到VB工程目录下,添加好后工程文件夹中的文件如下图2所示。
声明libTSCAN.dll中的函数
使用Declare 语句声明libTSCAN.dll中的函数。
语法如下:
Private Declare [Function|] 外部函数名 Lib "库文件名" [Alias "别名"] ([ 参数 列表])
可选,表示该声明在当前模块内可见。如果需要在多个模块中使用,可以使用Publ。
关键字,用于声明外部函数。
或:根据外部函数是返回值(Function)还是不返回值(Sub)来选择。
外部函数名:你在VB6.0代码中使用的函数名称。
指定包含函数定义的DLL库文件的名称。
库文件名:DLL库文件的名称,不包括扩展名(.lib或.dll)。
可选,如果DLL中的函数名称与VB6.0中的名称冲突或不符合VB6.0的命名规则,可以使用别名。
参数列表: 函数的参数,包括参数的名称、类型和传递方式(ByVal或ByRef)。
注:如需完整的VB6.0示例工程源代码,可以随时联系同星应用支持获取。
CAN /CANFD数据结构定义
CAN与CAN FD数据结构如下:
调用接口说明
Demo内部分使用到的接口说明:
initialize_lib_tscan_verbose
作用:初始化 tscan 库模块。必须调用此函数初始化 CAN 模块过后,才能够调用其他 API 函数。该函数和 finalize_lib_tscan 是成对使用的。
输入参数:
AEnableFIFO[IN]:是否开启 FIFO 机制,建议设置为 True,否则用户无法通过 tsfifo_receive_xx 函数读取报文;
AEnableErrorFrame[IN]:是否接收错误帧。如果设置为 False,则驱动直 接把 错误帧抛弃掉;
AUseHWTime[IN]:是否使用设备连接时间;
ATSType[IN] :设置为False 即可;
返回值:无
finalize_lib_tscan
作用:在退出程序之前,释放 CAN 模块,和创建函数initialize_lib_tscan 函数配对使用。
输入参数:无
返回值:无
tscan_get_device_info_detail
作用:获取设备 信息
输入参数:
ADeviceIndex[IN]:设备 索引 值;
AManufacturer [OUT]:制造商;
AProduct[OUT] :产品名称;
ASerial[OUT] :序列号;
ADeviceType[OUT] :设备类型;
ADeviceName[OUT] :设备名称;
ACANChannelCount[OUT] :CAN通道数量;
AIsCANFD[OUT] :是否支持CANFD;
ALINChannelCount[OUT] :LIN通道数量;
AFRChannelCount[OUT] :FR通道数量;
AEthernetChannelCount[OUT] :以太网通道数量;
tscan_connect
作用:连接设备,并获取该设备的唯一句柄
输入参数:
ADeviceSerial:获取指定序列号的设备,该参数为空字符则表示获取任意处于连接状态的设备;
AHandle:设备句柄,后续操作硬件都需要根据该唯一设备句柄进行操作;
tscan_scan_devices
作用:扫描在线设备数量
输入参数:
ADeviceCount[OUT]:返回在线设备数量;
tscan_config_can_by_baudrate
作用:配置CAN总线波特率
AHandle:设备句柄;
AChnIdx:应用程序通道编号;
ARateKbps:波特率;
A120OhmConnected:是否使能内部终端 电阻 ;
tscan_transmit_can_sync
作用:发送 CAN 报文,并 检测 到发送成功后,才退出此函数。此函数返回成功,代表 CAN 报文一定已经成功发送到了 CAN 总线上面。
输入参数:
ADeviceHandle:设备句柄;
ACAN:报文数据;
ATimeoutMS:同步等待超时时间;
tscan_transmit_can_async
作用:以异步的方式发送CAN报文
输入参数:
ACAN:CAN 数据包。TLIBCAN 数据组成请查CAN、CANFD数据组成章节。
tscan_add_cyclic_msg_can
作用:增加周期发送的报文
输入参数:
ADeviceHandle:操作设备句柄
ACAN:CAN数据包;
APeriodMS:周期值;
tscan_delete_cyclic_msg_can
作用:删除周期性发送 CAN 报文
ACAN:需要被删除的是、周期报文;
tsfifo_receive_can_msgs
作用:读取硬件缓存中的报文数据包。
输入参数:
ADeviceHandle:设备句柄;
ACANBuffe:数据 Buffer,用于存储读取到的报文,该 Buffer 需要函数调用方创建;
ACANBufferSize:消息 Buffer 的大小;
AChn:目标通道:对于多通道设备,本函数选择读取哪一个通道的数据,该参数可以为空,默认为通道 1;
ARxTx:==0:仅仅接收 Rx 报文;>0: Tx Rx 报文都读取回来,该参数可以为空,默认为只接收 Rx 报文;
tsfifo_add_can_canfd_pass_filter
作用:用户如果只想接收特定 ID 报文的时候,需要调用此函数
输入参数:
ADeviceHandle:设备句柄;
AChnIdx:通道索引;
AIdentifier:报文标识符;
AIsStd:是否标准帧;
tsfifo_delete_can_canfd_pass_filter
作用:取消报文过滤
输入参数:
ADeviceHandle:设备句柄;
AChnIdx:通道索引;
AIdentifier:报文标识符;
AIsStd:是否标准帧;
VB6.0 Demo实现效果
1)点击[扫描设备],获取在线设备数量打印于右边控件中。
2)点击[查询设备信息],获取设备具体信息打印于右边控件中。
3)点击[连接]完成硬件连接,打印连接成功日志及当前设备句柄于右边控件中。
4)点击[配置硬件通道],完成通道及波特率设置。
5.)点击[通道一发送普通报文]单帧发送0x7B。
6)点击[从通道2接收CAN报文],读取FIFO中的报文数据显示在下方ListBox中。
7)点击[发送周期报文] ,报文0x29A 按照50ms周期发送。
8)点击[停止周期发送] ,报文0x29A停止周期发送。
9)点击[从通道2接收CAN报文],读取FIFO中的报文数据显示子啊下方ListBox中。如图3所示。
疑难解答(QA)
Q:连接之后,设备一直在接收消息,此时我开启过滤之后,再去发送报文,接收报文的时候,是不是要把之前存的数据取出来,直到读取到过滤的ID?
A:对的。添加过滤后主动把旧的缓存给清除掉。清除缓存函数:tsfifo_clear_can_receive_buffers。
Q:函数的返回值代表什么意思?
A:函数返回值为0时代表函数执行成功,其他值代表函数执行失败。具体失败原因描述可以根据TSMaster内系统内置常数进行查表。如返回值为3代表“设备未找到”,这时候就要检查当前TSCAN设备是否连接正常了。