干货分享 | 基于VB6.0 实现 CAN信号收发 Demo

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

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


一、关于Demo工程

简要描述:

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

典型应用需求:

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

二、技术背景

在 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。

三、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

图片

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

图片

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 Declare Sub initialize_lib_tscan_verbose Lib "libTSCAN.dll" (ByVal AEnableFIFO As Boolean, ByVal AEnableErrorFrame As Boolean, ByVal AUseHWTime As Boolean, ByVal ATSType As Long)

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

Private Declare Sub finalize_lib_tscan Lib "libTSCAN.dll" ()

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

Private Declare Function tscan_get_device_info_detail Lib "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_connect Lib "libTSCAN.dll" (ByVal ADeviceSerial As String, ByRef AHandle As Long) As Long

'断开设备

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

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

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

'配置普通CAN硬件通道

Private Declare Function tscan_config_can_by_baudrate Lib "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_baudrate Lib "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_sync Lib "libTSCAN.dll" (ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN, ByVal ATimeoutMS As Long) As Long

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

'周期发送CAN/CANFD报文

'添加CAN周期发送报文

Private Declare Function tscan_add_cyclic_msg_can Lib "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数据结构如下:

图片

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

图片

四、疑难解答(QA)

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

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

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

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

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3281140.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python药物副作用生物图分析算法和矩阵降维算法

🎯要点 🎯人体疾病模块网络结构位置与病理生物学关系 | 🎯药物与药物靶点相互作用 | 🎯细胞和蛋白质之间的作用分层 | 🎯疾病和症状之间的联系 | 🎯药物与副作用之间的联系 | 🎯生物学分析 &a…

年过30年程序员,到底要不要考虑搞点副业

一、前言 作为一名年过三十的程序员,我深刻体会到了职场的残酷和不确定性。在这个技术日新月异的时代,我们不仅要在专业领域深耕细作,更要敏锐地捕捉互联网的风口,以确保自己不被时代淘汰。程序员的黄金年龄似乎被限定在35岁之前…

事务性邮件api接口服务怎么选?怎么集成?

事务性邮件API接口安全性如何保障?API接口调用方法? 在现代企业的运营中,事务性邮件是确保信息及时传达和用户体验的关键环节。AokSend将探讨如何选择合适的事务性邮件API接口服务,以及如何有效地集成这些服务。 事务性邮件api接…

MongoDB下载与基本使用(mac图文详解)

目录 一、下载安装 1.1 官网下载mongoDB 1.1.1 mongoDB 1.1.2 MongoDB GUI 1.2 下载流程 二、基本使用 2.1 创建数据库和集合 2.2 插入 2.3 查询 2.4 修改 2.5 删除 三、case 3.1 销售case 3.1.1 实操 3.1.2 全部指令汇总 背景: 个人练习用 一、下…

《计算机网络》(第8版)第九章 无线网络和移动网络 复习笔记

第九章 无线网络和移动网络 一、无线局域网 WLAN 1 无线局域网的组成 无线局域网提供移动接入的功能,可分为两大类:有固定基础设施的和无固定基础设 施的。 (1)IEEE 802.11 IEEE 802.11 是无线以太网的标准,是有固定…

MySQL安装教程(保姆级)

1. 首先要了解自己的计算机 打开设置——系统——系统信息 然后就可以知道自己计算机的类型了。 2. 下载MySQL 2.1. 来到MySQL官网 点击进入 我们下拉页面,可以找到DOWNLOADS 页面默认给咱们选择最新的版本,咱们不用,咱们尽量选一个稳定的版…

Linux的防火墙

一、防火墙概述 防火墙是一种计算机硬件和软件的结合,使internet和intranet之间建立一个安全网关(Security Gateway),从而保护内网免受非法用户侵入的技术。 防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。…

绝密!OceanBase OBCP备考模拟题讲解(2)

「源de爸讲数据库」每天更新OceanBase OBCP题库及全网独家超详细题目解析,祝您早日持证上岸! 现如今,一大批国产数据库随着国产化浪潮,已经逐步被越来越多的人认可。OceanBase便是其中一个优秀代表。 做这个日更专题,…

easy_Maze

结合题目,知道是一道迷宫题型 那么我们要做的就是 1.找到迷宫 2.确定方向(一般为wasd,但是可能会改) 3.确定起点 4.确定终点 // TAGS: dict_keys([spawn]) int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // raxint v5[49]; // [rsp0h]…

HCIA总结

一、情景再现:ISP网络为学校提供了DNS服务,所以,DNS服务器驻留在ISP网络内,而不再学校网络内。DHCP服务器运行在学校网络的路由器上 小明拿了一台电脑,通过网线,接入到校园网内部。其目的是为了访问谷歌网站…

【ROS 最简单教程 002/300】ROS 集成开发环境安装: Noetic

💗 有遇到安装问题可以留言呀 ~ 当时踩了挺多坑,能帮忙解决的我会尽力 ! 1. 安装操作系统环境 Linux ❄️ VM / VirtualBox Ubuntu20.04 如果已有 linux 环境 (如双系统等),可跳过步骤 1 ~ 👉 保姆级图文安装教程指路…

微服务事务管理(分布式事务问题 理论基础 初识Seata XA模式 AT模式 )

目录 一、分布式事务问题 1. 本地事务 2. 分布式事务 3. 演示分布式事务问题 二、理论基础 1. CAP定理 1.1 ⼀致性 1.2 可⽤性 1.3 分区容错 1.4 ⽭盾 2. BASE理论 3. 解决分布式事务的思路 三、初识Seata 1. Seata的架构 2. 部署TC服务 3. 微服务集成Se…

P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)

原题 题意 若一个由 01 01 01组成的字符串将 0 0 0和 1 1 1取反,并倒过来后与原字符串相同,则称为反对称字符串。现在给你一个长度为 n ( n ≤ 1 0 5 ) n(n \le 10^5) n(n≤105) 01 01 01组成的字符串,求它有多少个反对称子串。&#xff08…

Prometheus-部署

Prometheus-部署 Server端安装配置部署Node Exporters监控系统指标监控MySQL数据库监控nginx安装grafana Server端安装配置 1、上传安装包,并解压 cd /opt/ tar xf prometheus-2.30.3.linux-amd64.tar.gz mv prometheus-2.30.3.linux-amd64 /usr/local/prometheus…

npm install报错原因记录:npm ERR! code ENOENT

报错原因:路径打开错了,你需要在package.json这个文件的文件夹目录打开终端执行命令才行。 比如我的前端项目中,package.json项目在back-system-font-ts文件下,我就需要右击该文件,从该目录打开终端才有用

【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。

文章目录 背景界面demo遇到的问题最终后端demo(甚至比前端逻辑更简单) 背景 突发奇想,想要在前端实现一个fc游戏手柄,然后控制电脑的nes模拟器玩玩魂斗罗。 思路很简单,前后端使用websocket通信,connected标识socket链接已建立&a…

【Vulnhub系列】Vulnhub_Dr4g0n_b4ll 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Dr4g0n_b4ll靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境搭建 选择打开.ovf 文件 配置名称和路径 打开后调整网络连接模式为【NAT】即可 二、信息收集 1、主机…

RTC实时通信技术:GPT-4o急速响应背后的技术浅谈

RTC实时通信技术:GPT-4o急速响应背后的技术浅谈 RTC实时通信技术概述 RTC(Real Time Communication),即实时通信技术,是实时音视频通信的简称。其核心在于实现低延迟、高质量的音视频数据传输和处理,广泛…

2024华为数通HCIP-datacom最新题库(H12-831变题更新⑧)

请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 1、…