※環境:Lawicel社提供dll(canusbdrv.dll version 2.0.2)を使用 Windows7(32bit) VisualBasic2012
Private m_Callback As Lawicel.CANUSB.CANMsgCallbackDef
Private Sub Open_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Open.Click '■■■CANポート オープン処理■■■ Dim nRet As Integer
'///指定されたデバイス(シリアル番号を指定)をオープンする h = Lawicel.CANUSB.canusb_Open("LWZ55LBC", "500", Lawicel.CANUSB.CANUSB_ACCEPTANCE_CODE_ALL, Lawicel.CANUSB.CANUSB_ACCEPTANCE_MASK_ALL, 0)
'///正常にポートがオープンできたらコールバックを設定 If (h <> 0) Then Me.m_Callback = AddressOf Me.ReceiveCallBack nRet = Lawicel.CANUSB.canusb_setReceiveCallBack(h, Me.m_Callback) End If
End Sub
Private Delegate Sub ReceiveCmdToTextBox(ByVal RcvCmd As String)
Private Sub ReceiveCallBack(ByRef RxMsg As Lawicel.CANUSB.CANMsgCallback) '■■■受信メッセージの格納及びテキストボックス表示■■■ Dim iByteArray() As Byte Dim iData As String Dim sb1 As New System.Text.StringBuilder
'///受信メッセージをテキストボックスに追記する。 Dim args(0) As Object args(0) = sb1.ToString BeginInvoke(New ReceiveCmdToTextBox(AddressOf Me.RcvCmdToTextBox), args) End Sub
Private Sub RcvCmdToTextBox(ByVal RcvCmd As String) '■■■受信メッセージをテキストボックスに表示■■■ If IsNothing(RcvCmd) = False Then Txt_RcvCmd.Text = RcvCmd End If End Sub
canusb_setReceiveCallBackが要求するデリゲートCANMsgCallbackDefは、
Public Delegate Sub CANMsgCallbackDef(ByRef msg As CANUSB.CANMsgCallback)
だそうですよ。コールバックに使おうとしているメソッドの引数が全然違いますね。
あと、単純にそのままアンマネージに渡しているだけのようなので、
このままだとコールバックがそのうちGCに片付けられることになるかと思います。
デリゲートオブジェクトをフィールドに保持しておいた方がいいかと。
Private m_Callback As Lawice.CANUSB.CANMsgCallbackDef
Private Sub Open_Click(ByVal eventSender As Object, ByVal eventArgs As EventArgs) Handles Open.Click
' 略
Me.m_Callback = AddressOf Me.ReceiveCallback
nRet = Lawicel.CANUSB.canusb_setReceiveCallBack(h, Me.m_Callback)
' 略
End Sub
Private Sub Open_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Open.Click '■■■CANポート オープン処理■■■ Dim nRet As Integer
'///指定されたデバイス(シリアル番号を指定)をオープンする h = Lawicel.CANUSB.canusb_Open("LWZ55LBC", "500", Lawicel.CANUSB.CANUSB_ACCEPTANCE_CODE_ALL, Lawicel.CANUSB.CANUSB_ACCEPTANCE_MASK_ALL, 0)
'///正常にポートがオープンできたらコールバックを設定 If (h <> 0) Then nRet = Lawicel.CANUSB.canusb_setReceiveCallBack(h, AddressOf Me.ReciveCallBack) End If
End Sub
Private Sub ReciveCallBack() '■■■CANデータ受信時■■■ Console.WriteLine("受信") End Sub
(2)受信データを取り込むために後半を以下の様にすると
Private Sub ReciveCallBack(ByVal msg As Lawicel.CANUSB.CANMsg) '■■■CANデータ受信時■■■ Console.WriteLine("msg.id") Console.WriteLine("msg.len") Console.WriteLine("msg.data") End Sub