0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

上海同星智能科技有限公司 2024-07-27 08:21 次阅读

本文主要讲的是,基于TSMaster 实现TOSUN 系列 CAN/CANFD,LIN 设备的操作。主要给大家介绍在 TSMaster 软件里如何实现CAN 信号收发 Demo工程。

本文关键词:CAN报文、VB6.0、libTSCAN

1

关于Demo工程

简要描述:

VB6.0编程语言调用libTSCAN接口实现硬件扫描、连接、CAN报文单帧发送、周期发送、报文接收,报文过滤。

典型应用需求:

对于现在还在维护和开发的VB项目工程需要调用TSCAN硬件实现报文收发等业务。

2

技术背景

在 VB6.0中使用 Declare 语句声明libTSCAN.dll中的函数,这些声明使得 VB6.0能够与底层的 API 进行交互。如:Private Declare Function tscan_connect Lib "libTSCAN.dll" (ByVal ADeviceSerial As String, ByRef AHandle As Long) As Long。

3

Demo工程实现

1.

添加库文件

要实现对 TOSUN 系列 CAN/CANFD,LIN 设备的操作,需要基于 libTSCAN.dll ,libTSH.dll,binlog.dll 以及 liblog.dll动态链接库文件。它们之间依赖关系如下图1所示。

libTSCAN.dll ,libTSH.dll,binlog.dll 以及 liblog.dll动态链接库文件文件位置可以在TSMaster安装目录下获取。C:\Program Files (x86)\TOSUN\TSMaster\Data\SDK\examples\Python\Linux\lib\libTOSUN\windows\x86

360dce08-4bae-11ef-817b-92fbcf53809c.png

新建好VB工程后将以上依赖文件添加到VB工程目录下,添加好后工程文件夹中的文件如下图2所示。

3629c5a4-4bae-11ef-817b-92fbcf53809c.png

2.

声明libTSCAN.dll中的函数

使用Declare 语句声明libTSCAN.dll中的函数。


语法如下:

Private Declare [Function|Sub] 外部函数名 Lib "库文件名" [Alias "别名"] ([参数列表])

Private:可选,表示该声明在当前模块内可见。如果需要在多个模块中使用,可以使用Public

Declare:关键字,用于声明外部函数。

FunctionSub:根据外部函数是返回值(Function)还是不返回值(Sub)来选择。

外部函数名:你在VB6.0代码中使用的函数名称。

Lib:指定包含函数定义的DLL库文件的名称。

库文件名:DLL库文件的名称,不包括扩展名(.lib或.dll)。

Alias:可选,如果DLL中的函数名称与VB6.0中的名称冲突或不符合VB6.0的命名规则,可以使用别名。


参数列表:函数的参数,包括参数的名称、类型和传递方式(ByVal或ByRef)。

'加载libTSCAN函数库,必须在调用其他API之前执行

Private DeclareSub initialize_lib_tscan_verboseLib "libTSCAN.dll" (ByVal AEnableFIFO As Boolean, ByVal AEnableErrorFrame As Boolean, ByVal AUseHWTime As Boolean, ByVal ATSType As Long)


'释放libTSCAN函数库,必须在完成使用退出程序之前调用

Private Declare Sub finalize_lib_tscanLib "libTSCAN.dll" ()


'查询设备的制造商,产品名称,序列号,包含多少个CAN通道,是否支持FDCAN,多少个LIN通道,Flexray通道以及以太网通道

Private Declare Function tscan_get_device_info_detailLib "libTSCAN.dll" (ByVal ADeviceIndex As Long, ByRef AManufacturer As Long, ByRef AProduct As Long, ByRef ASerial As Long, ByRef ADeviceType As Long, ByRef ADeviceName As Long, ByRef ACANChannelCount As Long, ByRef AIsCANFD As Boolean, ByRef ALINChannelCount As Long, ByRef AFRChannelCount As Long, ByRef AEthernetChannelCount As Long) As Long


'连接设备

Private Declare Function tscan_connectLib "libTSCAN.dll" (ByVal ADeviceSerial As String, ByRef AHandle As Long) As Long


'断开设备

Private Declare Function tscan_disconnect_by_handleLib "libTSCAN.dll" (ByVal AHandle As Long) As Long


'查询当前在线的TSCAN设备数量

Private Declare Function tscan_scan_devicesLib "libTSCAN.dll" (ByRef ADeviceCount As Long) As Long


'配置普通CAN硬件通道

Private Declare Function tscan_config_can_by_baudrateLib "libTSCAN.dll" (ByVal AHandle As Long, ByVal AChnIdx As Long, ByVal ARateKbps As Double, ByVal A120OhmConnected As Long) As Long


'配置FDCAN硬件通道;AControllerType[0:普通CAN 1:ISO-FD 2:NoISO-FD] AControllerMode[0:Normal 1: ACKOff 2: Retricted 3: Internal Loop 4: External Loop]

Private Declare Function tscan_config_canfd_by_baudrateLib "libTSCAN.dll" (ByVal AHandle As Long, ByVal AChnIdx As Long, ByVal AArbRateKbps As Double, ByVal ADataRateKbps As Double, ByVal AControllerType As Long, ByVal AControllerMode As Long, ByVal A120OhmConnected As Long) As Long


'发送CAN/CANFD报文

Private Declare Function tscan_transmit_can_syncLib "libTSCAN.dll" (ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN, ByVal ATimeoutMS As Long) As Long


Private Declare Function tscan_transmit_can_asyncLib "libTSCAN.dll" (ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN) As Long


'周期发送CAN/CANFD报文

'添加CAN周期发送报文

Private Declare Function tscan_add_cyclic_msg_canLib "libTSCAN.dll" (ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN, ByVal APeriodMS As Single) As Long

'删除CAN周期发送报文

Private Declare Function tscan_delete_cyclic_msg_can Lib "libTSCAN.dll" (ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN) As Long


注:如需完整的VB6.0示例工程源代码,可以随时联系同星应用支持获取。

3.

CAN /CANFD数据结构定义

CAN与CAN FD数据结构如下:

36400ab2-4bae-11ef-817b-92fbcf53809c.png

4.

调用接口说明

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:设备句柄;

ACANBuffers:数据 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:是否标准帧;

5.

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所示。

36579128-4bae-11ef-817b-92fbcf53809c.png

4

疑难解答(QA)

Q:连接之后,设备一直在接收消息,此时我开启过滤之后,再去发送报文,接收报文的时候,是不是要把之前存的数据取出来,直到读取到过滤的ID?

A:对的。添加过滤后主动把旧的缓存给清除掉。清除缓存函数:tsfifo_clear_can_receive_buffers。

Q:函数的返回值代表什么意思?

A:函数返回值为0时代表函数执行成功,其他值代表函数执行失败。具体失败原因描述可以根据TSMaster内系统内置常数进行查表。如返回值为3代表“设备未找到”,这时候就要检查当前TSCAN设备是否连接正常了。

3678b218-4bae-11ef-817b-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN
    CAN
    +关注

    关注

    57

    文章

    2744

    浏览量

    463653
  • 信号
    +关注

    关注

    11

    文章

    2791

    浏览量

    76744
  • LIN
    LIN
    +关注

    关注

    4

    文章

    216

    浏览量

    40278
  • can报文
    +关注

    关注

    0

    文章

    4

    浏览量

    2323
收藏 人收藏

    评论

    相关推荐

    如何用VB6.0调用MSComm控件接收与显示数据呢

    如何用VB6.0调用MSComm控件接收与显示数据呢?有哪些步骤?
    发表于 02-14 06:52

    VB6.0数字示波单片机实时监测数据的一种方法

    本文介绍利用VB6.0数字动态图形显示单片机实时检测数据的一种方法,该显示方法符合人们看图习惯,视觉效果好且数值显示精确。关键词:VB6.0, 数字动态图形显示,单片机, 实
    发表于 08-05 16:03 33次下载

    基于VB6.0的PC机与单片机的远程通信

    简要介绍了VB6.0中MSComm通信控件的属性和使用方法,并给出了其在PC机与单片机远程通信中的应用。关键词:VB6.0 PC机 单片机 远程通信Abstract:This paper briefly introduce the principle and
    发表于 08-15 10:09 50次下载

    利用VB6.0实现测色仪的功能扩展

    在油墨行业中测色仪已经使用非常广泛,但对套印油墨颜色的综合测试评价方面还不能满足需要。本文就此问题提出了利用VB6.0 中MSCOMM 控件来扩展测色仪功能从而实现绘制色区图
    发表于 08-27 11:27 23次下载

    利用VB6.0实现机车下线机自动控制系统

    本文介绍了应用VB6.0作为开发工具,利用工控机和ACL-7225数据采集卡,开发自动控制系统的方法。系统共有22个输入信号和16个输出信号,采用了两块数据采集卡,由计算机通过数据采
    发表于 09-02 10:04 33次下载

    VB6.0在LED汉字信息显示系统中的应用

    本文介绍了 VB6.0 在LED 汉字信息显示系统的应用中如何进行实时汉字点阵提取及串行通讯的方法,讨论了程序设计要点,给出了相应的程序代码。
    发表于 09-09 16:45 31次下载

    基于VB6.0的打印口(LPT)的应用

             在 VB6.0 编程环境下,调用动态链接库,通过打印口(LPT)实现PC 机对89C2051 单片机的编程。关键词: VB6.0
    发表于 09-11 09:13 39次下载

    VB控件使用大全 (VB6.0中通过MSChart控件调用数

    VB控件使用大全:《 VB6.0中通过MSChart控件调用数据库 》   02.txt 《 用VB6实现动态增减控件 》   03.t
    发表于 09-13 15:34 1275次下载
    <b class='flag-5'>VB</b>控件使用大全 (<b class='flag-5'>VB6.0</b>中通过MSChart控件调用数

    基于VB6.0的点阵字模信息提取方法

    摘要:提出通过颜色法提取像素点的汉字点阵字模信息提取方法,给出基于VB6.0的系统控件设置及流程实现方法。与基于内码法的汉字点阵提取方法的比较结果表明,该方法能够方便
    发表于 07-16 11:20 67次下载

    VB6.0动态加载ActiveX控件漫谈

    熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。VB6.0已能够解决该问题
    发表于 10-08 15:21 71次下载

    VB6.0实现PC机与单片机的串行通信

    VB6.0实现PC机与单片机的串行通信:
    发表于 03-31 15:11 118次下载

    Vb6.0精简版下载

    电子发烧友网站提供《Vb6.0精简版下载.exe》资料免费下载
    发表于 04-02 09:43 0次下载

    Visual+Basic+6.0+(vb6.0)简体中文企业版下载

    电子发烧友网站提供《Visual+Basic+6.0+(vb6.0)简体中文企业版下载.exe》资料免费下载
    发表于 08-18 10:04 0次下载

    基于VB6.0的机车静压试验台程序

    基于VB6.0的机车静压试验台程序
    发表于 09-02 15:41 4次下载

    基于VB6.0的串行通信工控软件设计及实例

    电子发烧友网站提供《基于VB6.0的串行通信工控软件设计及实例.pdf》资料免费下载
    发表于 10-31 09:33 1次下载
    基于<b class='flag-5'>VB6.0</b>的串行通信工控软件设计及实例