USB to VB.NET


Closed Thread
Results 1 to 13 of 13

Thread: USB to VB.NET

Hybrid View

  1. #1

    Default USB to VB.NET

    Can someone please assist me, i am trying to get a PIC18F4550 to talk to a VB application.
    If i connect the pic the software detects the pic but no data comes through.
    I have hard coded the data witch should be sended.
    any advice on how to send data back to the PIC would also be appreciated

    PIC Code
    Code:
    DEFINE OSC 48          
    DEFINE LOADER_USED 1
    
    USBBufferSizeTX    con 8  ' input 
    USBBufferSizeRX    con 8  ' output
    
    ' the USB buffer...
    USBBufferTX       Var Byte[USBBufferSizeTX]
    USBBufferRX       Var Byte[USBBufferSizeRX] 
    USBBufferCount   Var Byte 
    
    ' ************************************************************
    ' * main program loop - remember, you must keep the USB      *
    ' * connection alive with a call to USBService every couple  *
    ' * of milliseconds or so...                                 *
    ' ************************************************************
    usbinit ' initialise USB...
    ProgramStart: 
    	USBBufferTX[0] = "1"
    	USBBufferTX[1] = "2"
    	USBBufferTX[2] = "3"
    	USBBufferTX[3] = "4"
    	USBBufferTX[4] = "5"
    	USBBufferTX[5] = "6"
    	USBBufferTX[6] = "7"
    	USBBufferTX[7] = "8"
       gosub DoUSBIn
       gosub DoUSBOut
       goto ProgramStart   
    
    ' ************************************************************
    ' * receive data from the USB bus                            *
    ' ************************************************************
    DoUSBIn:
       USBBufferCount = USBBufferSizeRX              ' RX buffer size
       USBService                                    ' keep connection alive
       USBIn 1, USBBufferRX, USBBufferCount, DoUSBIn   ' read data, if available
       return
        
    ' ************************************************************
    ' * wait for USB interface to attach                         *
    ' ************************************************************
    DoUSBOut:
       USBBufferCount = USBBufferSizeTX              ' TX buffer size
       USBService                                    ' keep connection alive
       USBOut 1, USBBufferTX, USBBufferCount, DoUSBOut ' if bus available, transmit data
       return
    VB.NET code the form only contains textboxes and i use VB.NET2008
    Code:
    Option Strict Off
    Option Explicit On
    
    Friend Class MainForm
        Inherits System.Windows.Forms.Form
    
        ' vendor and product IDs
        Private Const VendorID As Short = 6017
        Private Const ProductID As Short = 2000
    
        ' read and write buffers
        Private Const BufferInSize As Short = 8
        Private Const BufferOutSize As Short = 8
        Dim BufferIn(BufferInSize) As Byte
        Dim BufferOut(BufferOutSize) As Byte
    
        ' ****************************************************************
        ' when the form loads, connect to the HID controller - pass
        ' the form window handle so that you can receive notification
        ' events...
        '*****************************************************************
        Private Sub MainForm_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
            ' do not remove!
            ConnectToHID(Me.Handle.ToInt32)
        End Sub
    
        '*****************************************************************
        ' disconnect from the HID controller...
        '*****************************************************************
        Private Sub MainForm_FormClosed(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
            DisconnectFromHID()
        End Sub
    
        '*****************************************************************
        ' a HID device has been plugged in...
        '*****************************************************************
        Public Sub OnPlugged(ByVal pHandle As Integer)
            If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
                ' ** YOUR CODE HERE **
                TextBox1.Text = "plugged"
            End If
        End Sub
    
        '*****************************************************************
        ' a HID device has been unplugged...
        '*****************************************************************
        Public Sub OnUnplugged(ByVal pHandle As Integer)
            If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
                hidSetReadNotify(hidGetHandle(VendorID, ProductID), False)
                TextBox1.Text = "unplugged"
            End If
        End Sub
    
        '*****************************************************************
        ' controller changed notification - called
        ' after ALL HID devices are plugged or unplugged
        '*****************************************************************
        Public Sub OnChanged()
            ' get the handle of the device we are interested in, then set
            ' its read notify flag to true - this ensures you get a read
            ' notification message when there is some data to read...
            Dim pHandle As Integer
            pHandle = hidGetHandle(VendorID, ProductID)
            hidSetReadNotify(hidGetHandle(VendorID, ProductID), True)
        End Sub
    
        '*****************************************************************
        ' on read event...
        '*****************************************************************
        Public Sub OnRead(ByVal pHandle As Integer)
            ' read the data (don't forget, pass the whole array)...
            If hidRead(pHandle, BufferIn(0)) Then
                ' ** YOUR CODE HERE **
                ' first byte is the report ID, e.g. BufferIn(0)
                ' the other bytes are the data from the microcontroller...
                TextBox2.Text = BufferIn(0)
                TextBox3.Text = BufferIn(1)
                TextBox4.Text = BufferIn(2)
                TextBox5.Text = BufferIn(3)
                TextBox6.Text = BufferIn(4)
                TextBox7.Text = BufferIn(5)
                TextBox8.Text = BufferIn(6)
                TextBox9.Text = BufferIn(7)
            End If
        End Sub
    End Class

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    After setting the data in the TX buffer, the first thing you do is ...
    gosub DoUSBIn

    It will sit there until it receives something from the PC, and nothing will be sent.
    The VB program doesn't send anything, so it's stuck in the DoUSBIn subroutine.

    The subroutine can be changed to continue if nothing is received.
    DT

  3. #3
    Join Date
    Oct 2004
    Posts
    448

    Default

    Quote Originally Posted by Darrel Taylor View Post
    It will sit there until it receives something from the PC, and nothing will be sent.
    The VB program doesn't send anything, so it's stuck in the DoUSBIn subroutine.
    Precisely where I am stuck in my misadventures with USB.

    I dont think I have fully understood the syntax and the arguments for USBIN;

    How exactly do you timeout and get out of the subroutine, Darrel?

    "USBIn 1, USBBuffer, USBBufferCount, DoUSBIn"

    Is it by changing the last argument, or is there any other way?

    Anand

  4. #4

    Default

    After looking at some other code this is what i did and it works, now for the next one sending data from the VB application
    Code:
    ' ************************************************************
    ' * receive data from the USB bus                            *
    ' ************************************************************
    DoUSBIn:
       USBBufferCount = USBBufferSizeRX              ' RX buffer size
       USBService                                    ' keep connection alive
       USBIn 1, USBBufferRX, USBBufferCount, Timeout   ' read data, if available
    Timeout:                                            '
       return
        
    ' ************************************************************
    ' * wait for USB interface to attach                         *
    ' ************************************************************
    DoUSBOut:
     WaitPC:
       USBBufferCount = USBBufferSizeTX              ' TX buffer size
       USBService                                    ' keep connection alive
       USBOut 1, USBBufferTX, USBBufferCount, Waitpc ' if bus available, transmit data
       return

  5. #5
    Join Date
    Jan 2009
    Location
    Miami, Florida USA
    Posts
    644

    Default

    Quote Originally Posted by Andre_Pretorius View Post
    After looking at some other code this is what i did and it works, now for the next one sending data from the VB application
    Code:
    ' ************************************************************
    ' * receive data from the USB bus                            *
    ' ************************************************************
    DoUSBIn:
       USBBufferCount = USBBufferSizeRX              ' RX buffer size
       USBService                                    ' keep connection alive
       USBIn 1, USBBufferRX, USBBufferCount, Timeout   ' read data, if available
    Timeout:                                            '
       return
        
    ' ************************************************************
    ' * wait for USB interface to attach                         *
    ' ************************************************************
    DoUSBOut:
     WaitPC:
       USBBufferCount = USBBufferSizeTX              ' TX buffer size
       USBService                                    ' keep connection alive
       USBOut 1, USBBufferTX, USBBufferCount, Waitpc ' if bus available, transmit data
       return
    For DoUSBin that is also what I did to get out of the loop. However, I don't know if that is the best solution. The problem that I found with this approach is that I lost some of the incoming USB data. Somehow, some of the USB data going to the PIC got lost while the PIC was doing something else. I don't know if the incomming data sits in the PIC buffers waiting to be read or not.

    I got the best results by combinning the original DoUSBin routine with the modified one.

    Robert

  6. #6
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    Another easy way is to use USB_ASM_Service.pbp ...
    http://www.picbasic.co.uk/forum/show...8306#post78306

    Then you don't have to worry about adding USBSERVICE or USBINIT, it's handled by the USB interrupts.

    It also tells you when something has been received, so you can gosub to DoUSBin only when needed.

    Code:
    Main:
        IF RX_READY THEN GOSUB DoUSBin
    ; ...
    GOTO Main
    Has a TX_READY too, which tells you when it's ok to send, instead of getting locked up in the DoUSBout routine.

    hth,
    DT

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts