⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receive.frm

📁 这是我读研的时候用VB开发的一个与基于CAN-PCI5121的通讯小程序
💻 FRM
📖 第 1 页 / 共 2 页
字号:
            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 + -