企业宣传,产品推广,广告招商,广告投放联系seowdb

基于VB6.0 实现 Demo CAN信号收发

本文主要讲的是,基于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设备是否连接正常了。

© 版权声明
评论 抢沙发
加载中~
每日一言
不怕万人阻挡,只怕自己投降
Not afraid of people blocking, I'm afraid their surrender