📄 receive.frm
字号:
Top = 360
Width = 855
End
Begin VB.TextBox Text2
Height = 285
Left = 1200
TabIndex = 6
Text = "00000000"
Top = 360
Width = 855
End
Begin VB.Label Label13
Caption = "模式:"
Height = 255
Left = 4440
TabIndex = 17
Top = 870
Width = 615
End
Begin VB.Label Label12
Caption = "滤波方式:"
Height = 255
Left = 4320
TabIndex = 16
Top = 410
Width = 975
End
Begin VB.Label Label11
Caption = "定时器1:0x"
Height = 255
Left = 2280
TabIndex = 15
Top = 870
Width = 1215
End
Begin VB.Label Label8
Caption = "定时器0:0x"
Height = 255
Left = 120
TabIndex = 14
Top = 870
Width = 1215
End
Begin VB.Label Label2
Caption = "屏蔽码:0x"
Height = 255
Left = 2280
TabIndex = 13
Top = 410
Width = 1095
End
Begin VB.Label Label1
Caption = "验收码:0x"
Height = 255
Left = 120
TabIndex = 12
Top = 410
Width = 975
End
End
Begin VB.Label Label10
Caption = "第几路CAN:"
Height = 255
Left = 2520
TabIndex = 19
Top = 360
Width = 1095
End
Begin VB.Label Label9
Caption = "设备索引号:"
Height = 255
Left = 240
TabIndex = 18
Top = 360
Width = 1095
End
End
Begin VB.Menu DeviceMessage
Caption = "设备信息"
End
Begin VB.Menu ReadCANStatus
Caption = "读CAN控制器的状态"
End
End
Attribute VB_Name = "Receive"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim m_devtype As Long 'PCI5121类型号
Dim m_connect As Byte '与设备相连标志
Dim m_devind As Long '设备索引号
Dim m_cannum As Long 'm_cannum代表第几路CAN
Private Sub Command1_Click() '点击“发送”按钮
If m_connect = 0 Then
MsgBox ("请先打开端口")
Exit Sub
End If
Dim SendType, frameformat, frametype As Byte
Dim ID As Long
Dim data(7) As Byte
Dim frameinfo As VCI_CAN_OBJ
Dim str As String
SendType = Combo3.ListIndex '发送帧类型
frametype = Combo4.ListIndex '是否是扩展帧
frameformat = Combo5.ListIndex '是否时远程帧
str = "&H"
str = str + Text1.Text 'Text1.Text为帧ID
ID = Val(str)
str = Text4.Text 'Text4.Text为向下发的数据
strdata = " "
i = 0
For i = 0 To 7
strdata = Left(str, 2)
If Len(strdata) = 0 Then 'Len函数返回 Long,其中包含字符串内字符的数目
Exit For
End If
str = Right(str, Len(str) - 3)
data(i) = Val("&H" + strdata)
Next
frameinfo.DataLen = i '数据长度(<=8),即Data的长度
frameinfo.ExternFlag = frametype '是否是扩展帧,ExternFlag = 0 时为标准帧,=1时为扩展帧
frameinfo.RemoteFlag = frameformat '是否时远程帧,!RemoteFlag = 0 时为数据帧 =1时为远程帧
frameinfo.SendType = SendType '发送帧类型,=0时为正常发送,=1时为单次发送,=2时为自发自收,=3时为单次自发自收,只在此帧为发送帧时才有意义
frameinfo.ID = ID
For j = 0 To i - 1
frameinfo.data(j) = data(j) 'data报文的数据
Next
If VCI_Transmit(m_devtype, m_devind, m_cannum, frameinfo, 1) <> 1 Then ''返回值:返回实际发送的帧数。此函数用来返回实际发送的帧数 DeviceType-设备类型号 DeviceInd-设备索引号 CANInd-第几路CAN Send-要发送的数据帧数组的首指针 len-要发送的数据帧数组的长度
a = VCI_Transmit(m_devtype, m_devind, m_cannum, frameinfo, 1)
MsgBox ("发送数据失败")
Else
a = VCI_Transmit(m_devtype, m_devind, m_cannum, frameinfo, 1)
List1.AddItem "发送数据成功", List1.ListCount
End If
End Sub
Private Sub Command2_Click() '点击“启动CAN”按钮
a = VCI_ClearBuffer(m_devtype, m_devind, m_cannum) '清空缓冲区
If a <> 0 Then
' MsgBox ("清空缓冲区成功")
End If
If m_connect = 0 Then
MsgBox ("请先打开端口")
Exit Sub
End If
If VCI_StartCAN(m_devtype, m_devind, m_cannum) <> 1 Then
MsgBox ("启动CAN错误")
Else
List1.AddItem "启动CAN成功", List1.ListCount
End If
End Sub
Private Sub Command3_Click() '点击“复位CAN”按钮
If m_connect = 0 Then
MsgBox ("请先打开端口")
Exit Sub
End If
If VCI_ResetCAN(m_devtype, m_devind, m_cannum) <> 1 Then
MsgBox ("复位CAN错误")
Else
List1.AddItem "复位CAN成功", List1.ListCount
End If
End Sub
Private Sub Connect_Click() '点击"连接"按钮
Dim index As Long '用来放设备索引号
Dim cannum As Long
Dim code, mask As Long
Dim Timing0, Timing1, filtertype, Mode As Byte
Dim InitConfig As VCI_INIT_CONFIG '该结构体定义了初始化CAN的配置,该结构体将在VCI_InitCAN函数中被填充
If m_connect = 1 Then
m_connect = 0
Connect.Caption = "连接"
VCI_CloseDevice m_devtype, m_devind
Exit Sub
End If
'
If Combo1.ListIndex <> -1 And Combo2.ListIndex <> -1 Then
index = Combo1.ListIndex
cannum = Combo2.ListIndex
filtertype = Combo6.ListIndex
Mode = Combo7.ListIndex
code = Val("&H" + Text2.Text)
mask = Val("&H" + Text3.Text)
Timing0 = Val("&H" + Text5.Text)
Timing1 = Val("&H" + Text6.Text)
InitConfig.AccCode = code '验收码
InitConfig.AccMask = mask '屏蔽码
InitConfig.Filter = filtertype '滤波方式
InitConfig.Mode = Mode '模式
InitConfig.Timing0 = Timing0 '定时器0
InitConfig.Timing1 = Timing1 '定时器1
If VCI_OpenDevice(m_devtype, index, 0) <> 1 Then
MsgBox ("打开设备错误")
Else
If VCI_InitCAN(m_devtype, index, cannum, InitConfig) = 1 Then '***初始化CAN
m_connect = 1
m_devind = index '这里给设备索引号m_devind赋值
m_cannum = cannum 'm_cannum代表第几路CAN
Connect.Caption = "断开"
Else
MsgBox ("初始化CAN错误")
End If
End If
End If
End Sub
Private Sub Device_Click()
End Sub
Private Sub Form_Load()
m_devtype = 1 'PCI5121类型号
m_connect = 0 '即默认为没有连接
m_cannum = 0 '默认为第0路CAN
Combo1.ListIndex = 0 '先在Combo1的List属性中把要显示的内容输进去,然后通过.ListIndex属性就会选择想要的内容。在属性栏中把style选为2-Dropdown List即可。与Locked属性无关
Combo2.ListIndex = 1
Combo3.ListIndex = 0
Combo4.ListIndex = 1
Combo5.ListIndex = 0
Combo6.ListIndex = 1
Combo7.ListIndex = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
If m_connect = 1 Then
m_connect = 0
VCI_CloseDevice m_devtype, m_devind
End If
End Sub
Private Sub Timer1_Timer()
Timer1.Enabled = False '先把Timer1停掉,准备接收处理数据
Dim ErrInfo As VCI_ERR_INFO
If m_connect = 0 Then '没有连接设备
Timer1.Enabled = True
Exit Sub
End If
Dim length As Long
Dim frameinfo(49) As VCI_CAN_OBJ
Dim str As String
length = VCI_Receive(m_devtype, m_devind, m_cannum, frameinfo(0), 1, 10) ''此函数从指定的设备读取数据 返回值:返回实际读取到的帧数。 frameinfo(0)相当于Receive-用来接收的数据帧数组的首指针 50相当于原函数中的len-用来接收的数据帧数组的长度 10相当于原函数中WaitTime-等待超时时间,以毫秒为单位 如果返回值为0xFFFFFFFF,则表示读取数据失败,有错误发生,请调用VCI_ReadErrInfo函数来获取错误码。
If length <= 0 Then
VCI_ReadErrInfo m_devtype, m_devind, m_cannum, ErrInfo '注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,
'千万不能省略这一步(即使你可能不想知道错误码是什么)
Timer1.Enabled = True
Exit Sub
End If
For i = 0 To length - 1
str = "接收到数据帧: "
If frameinfo(i).TimeFlag = 0 Then 'TimeFlag 表示是否使用时间标识,为1时TimeStamp有效,TimeFlag和TimeStamp只在此帧为接收帧时才有意义
tmpstr = "时间标识:无 "
Else
tmpstr = "时间标识:0x" + Hex(frameinfo(i).TimeStamp) 'TimeStamp,接收到信息帧时的时间标识,从CAN控制器初始化开始计时
End If
str = str + tmpstr
tmpstr = " 帧ID:0x" + Hex(frameinfo(i).ID)
str = str + tmpstr
str = str + " 帧格式:"
If frameinfo(i).RemoteFlag = 0 Then '!?RemoteFlag = 0 时为数据帧
tmpstr = "数据帧 "
Else
tmpstr = "远程帧 "
End If
str = str + tmpstr
str = str + " 帧类型:"
If frameinfo(i).ExternFlag = 0 Then '!?ExternFlag = 0 时为标准帧
tmpstr = "标准帧 "
Else
tmpstr = "扩展帧 "
End If
str = str + tmpstr
List1.AddItem str, List1.ListCount
If frameinfo(i).RemoteFlag = 0 Then
str = " 数据:"
If frameinfo(i).DataLen > 8 Then 'DataLen:数据长度(<=8),即Data的长度
frameinfo(i).DataLen = 8
End If
For j = 0 To frameinfo(i).DataLen - 1
tmpstr = Hex(frameinfo(i).data(j)) + " "
str = str + tmpstr
Next
List1.AddItem str, List1.ListCount
End If
Next
Timer1.Enabled = True
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -