本文主要講的是,基于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
新建好VB工程后將以上依賴文件添加到VB工程目錄下,添加好后工程文件夾中的文件如下圖2所示。
2.
聲明libTSCAN.dll中的函數
使用Declare 語句聲明libTSCAN.dll中的函數。
語法如下:
Private Declare [Function|Sub] 外部函數名 Lib "庫文件名" [Alias "別名"] ([參數列表])
Private:可選,表示該聲明在當前模塊內可見。如果需要在多個模塊中使用,可以使用Public。
Declare:關鍵字,用于聲明外部函數。
Function或Sub:根據外部函數是返回值(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數據結構如下:
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所示。
4
疑難解答(QA)
Q:連接之后,設備一直在接收消息,此時我開啟過濾之后,再去發送報文,接收報文的時候,是不是要把之前存的數據取出來,直到讀取到過濾的ID?
A:對的。添加過濾后主動把舊的緩存給清除掉。清除緩存函數:tsfifo_clear_can_receive_buffers。
Q:函數的返回值代表什么意思?
A:函數返回值為0時代表函數執行成功,其他值代表函數執行失敗。具體失敗原因描述可以根據TSMaster內系統內置常數進行查表。如返回值為3代表“設備未找到”,這時候就要檢查當前TSCAN設備是否連接正常了。
-
CAN
+關注
關注
57文章
2720瀏覽量
463395 -
信號
+關注
關注
11文章
2781瀏覽量
76648 -
LIN
+關注
關注
4文章
216瀏覽量
40243 -
can報文
+關注
關注
0文章
4瀏覽量
2320
發布評論請先 登錄
相關推薦
評論