Отговори на тема  [ 52 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща
PIC32 (и не само) - USB комуникация? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
За момента съм измъдрил (от гледна точка на PC-to):
- ако има данни за изпращане в изходящия буфер, стартирам "BackGorundWorker", който работи докато има данни за изпращане.
- Процедурата по изпращане е следната - Преди всеки опит за изпращане на данни, пращам Vendor specific control transfer към девайса, в който девайса връща максимума данни, които може да поеме. После вече е лесно - пращам максимум толкова, колкото устройството може да поеме, и ако има остатък, след известно време (примерно 4-5ms), отново "питам" девайса колко може да поеме, и пращам поредната порция.
- Като се стигне до момента, в който няма вече нищо за изпращане, деактивирам "BackgroundWorker" обекта.

Така програмата само пише и чете от 2 буфера, а за останалото се грижи моя клас.

...само дето Backgrоundworker-а не ми се чини най-елегантното решение. Щеше ми се да ползвам асинхронното четене и писане на libusb, но то няма такова за control трансфери, а само за обикновени. Има даден пример за Monolibusb (което е част от libusbdotnet),но не и за самия libusbdotnet. А документацията е супер разхвърляна и объркваща, поне за мен.

Ако имате някакви други идеи, споделете, моля.


Вто Мар 13, 2012 9:24 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
Подкарах го с thread (не backgorundworker), който пускам още при връзването. Той гледа буфера и ако има нещо се стреми да го изпрати. Ако изпрати всичко или в буфера няма нищо, заспива. При всяко следващо писане в буфера го събуждам, и той пак си върши там каквото върши.

Като го докарам до приличен външен вид ще го кача тук. Стана точно както исках. Хем не товари компютъра, хем си върши работата когато трябва да я свърши, хем като се заизлиза от програмата не се куми докато се затвори. Намерих пълното щастие, демек. :)


Сря Мар 14, 2012 9:07 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
Eto и кода. Не е изчистен до край, но поне работи.
Код:
Imports LibUsbDotNet
Imports LibUsbDotNet.Main
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Imports System.Threading

Public Interface IUniComm
    Sub Init()
    Function Connect() As Boolean
    Sub Disconnect()
    Function Read(ByRef DBuffer() As Byte, ByVal DOffset As Int32, ByVal MaxBytes As Int32) As Int32
    Function Write(ByRef DBuffer() As Byte, ByVal DOffset As Int32, ByVal NumBytes As Int32) As Boolean
    ReadOnly Property RXDataCount As Int32
    ReadOnly Property TXFreeSpace As Int32
    Event DataReceived()
End Interface

Public Class USBGen_LibUSB
    Implements IUniComm
    Implements IDisposable

    Public Const RXFIFOSIZE As Int32 = 65536
    Public Const TXFIFOSIZE As Int32 = 65536

    Public DevVID As Int32 = Int32.MaxValue
    Public DevPID As Int32 = Int32.MaxValue
    Public DevRevision As Int32 = Int32.MaxValue
    Public DevSerialNumber As String = String.Empty
    Public DevGUID As Guid = Guid.Empty

    Public Event DataReceived() Implements IUniComm.DataReceived

    Private MyUSBDevice As UsbDevice
    Private MyUSBDeviceFinder As UsbDeviceFinder
    Private WholeUSBDevice As IUsbDevice
    Private MyUSBWriter As UsbEndpointWriter
    Private WithEvents MyUSBReader As UsbEndpointReader
    Private MyUSBSetupPacket As UsbSetupPacket

    Private RXFIFO(RXFIFOSIZE - 1) As Byte
    Private RXReadPos As Int32
    Private RXWritePos As Int32

    Private TXFIFO(TXFIFOSIZE - 1) As Byte
    Private TXReadPos As Int32
    Private TXWritePos As Int32

    Private bkThread As Threading.Thread
    Private bkThExit As Boolean

    Public Function Connect() As Boolean Implements IUniComm.Connect
        Dim rv As Boolean
        rv = False
        Disconnect()
        MyUSBDeviceFinder = New UsbDeviceFinder(DevVID, DevPID, DevRevision, DevSerialNumber, DevGUID)
        MyUSBDevice = UsbDevice.OpenUsbDevice(MyUSBDeviceFinder)
        If MyUSBDevice IsNot Nothing Then
            WholeUsbDevice = TryCast(MyUSBDevice, IUsbDevice)
            If Not ReferenceEquals(WholeUsbDevice, Nothing) Then
                WholeUsbDevice.SetConfiguration(1)
                WholeUsbDevice.ClaimInterface(0)
            End If
            MyUSBWriter = MyUSBDevice.OpenEndpointWriter(WriteEndpointID.Ep01)
            MyUSBReader = MyUSBDevice.OpenEndpointReader(ReadEndpointID.Ep02, 4096)
            MyUSBReader.DataReceivedEnabled = True
            With MyUSBSetupPacket
                .RequestType = UsbCtrlFlags.RequestType_Vendor Or UsbCtrlFlags.Recipient_Interface Or UsbCtrlFlags.Direction_In
                .Request = 1
                .Value = 0
                .Length = 4
            End With
            bkThread = New Threading.Thread(AddressOf Me.Th_DoWork)
            bkThExit = False
            bkThread.Start()
            rv = True
        End If
        Return rv
    End Function

    Public Sub Disconnect() Implements IUniComm.Disconnect
        If bkThread IsNot Nothing Then
            bkThExit = True
            bkThread.Interrupt()
            If bkThread.ThreadState = Threading.ThreadState.Running Then bkThread.Join()
        End If
        bkThread = Nothing
        If MyUSBDevice IsNot Nothing Then
            If MyUSBDevice.IsOpen Then
                WholeUSBDevice = TryCast(MyUSBDevice, IUsbDevice)
                If Not ReferenceEquals(WholeUSBDevice, Nothing) Then
                    WholeUSBDevice.ReleaseInterface(0)
                End If
                MyUSBReader.DataReceivedEnabled = False
                MyUSBDevice.Close()
            End If
            MyUSBDevice = Nothing
            WholeUSBDevice = Nothing
            MyUSBDeviceFinder = Nothing
            MyUSBReader = Nothing
            MyUSBWriter = Nothing
        End If
    End Sub

    Public Sub Init() Implements IUniComm.Init
        Disconnect()
        RXReadPos = 0
        RXWritePos = 0
        DevVID = Int32.MaxValue
        DevPID = Int32.MaxValue
        DevRevision = Int32.MaxValue
        DevGUID = Guid.Empty
    End Sub

    Public ReadOnly Property RXDataCount As Int32 Implements IUniComm.RXDataCount
        Get
            Dim i As Int32
            i = RXWritePos - RXReadPos
            If i < 0 Then i += RXFIFOSIZE
            Return i
        End Get
    End Property

    Public Function Read(ByRef DBuffer() As Byte, ByVal DOffset As Int32, ByVal MaxBytes As Int32) As Int32 Implements IUniComm.Read
        Dim i As Int32
        If MaxBytes < 0 Then MaxBytes = 0
        If MaxBytes > 0 Then
            i = RXDataCount
            If MaxBytes > i Then MaxBytes = i
            While i > 0
                DBuffer(DOffset) = RXFIFO(RXReadPos)
                DOffset += 1
                RXReadPos = (RXReadPos + 1) Mod RXFIFOSIZE
                i -= 1
            End While
        End If
        Return MaxBytes
    End Function

    Public ReadOnly Property TXFreeSpace As Int32 Implements IUniComm.TXFreeSpace
        Get
            Dim i As Int32
            i = TXWritePos - TXReadPos
            If i < 0 Then i += TXFIFOSIZE
            i = TXFIFOSIZE - i
            Return i
        End Get
    End Property

    Public Function Write(ByRef DBuffer() As Byte, ByVal DOffset As Integer, ByVal NumBytes As Integer) As Boolean Implements IUniComm.Write
        Dim i As Int32
        If NumBytes > TXFreeSpace Then Throw New Exception("Not enough space in TX buffer.")
        For i = 0 To NumBytes - 1
            TXFIFO(TXWritePos) = DBuffer(DOffset + i)
            TXWritePos = (TXWritePos + 1) Mod TXFIFOSIZE
        Next
        If bkThread IsNot Nothing Then bkThread.Interrupt() 'Wake up the writing thread if asleep
        Debug.Print("Data sent: (" & i & " of " & NumBytes & " byte(s) )")
        Return True
    End Function


    Public Sub Dispose() Implements IDisposable.Dispose
        Disconnect()
    End Sub

    Private Sub MyUSBReader_DataReceived(sender As Object, e As LibUsbDotNet.Main.EndpointDataEventArgs) Handles MyUSBReader.DataReceived
        Dim i As Int32
        Dim s As String
        Debug.Print("SSCOMM: Received " & e.Count & " byte(s):")
        If e.Count > 0 Then
            If RXDataCount + e.Count < RXFIFOSIZE Then
                s = ""
                For i = 0 To e.Count - 1
                    s = s & e.Buffer(i) & " "
                    RXFIFO(RXWritePos) = e.Buffer(i)
                    RXWritePos = (RXWritePos + 1) Mod RXFIFOSIZE
                Next i
                Debug.Print(s)
            Else
                Throw New Exception("RX FIFO overflow")
            End If
            RaiseEvent DataReceived()
        End If
    End Sub
    Private Sub Th_DoWork()
        Dim lDevMaxDataSize As Int32
        Dim lDevWait As Int32
        Dim lTXSize As Int32
        Dim i(0) As Int32
        Try
            While (True)
                If TXReadPos <> TXWritePos Then

                    lDevWait += 1
                    If lDevWait > 1000 Then lDevWait = 1000

                    If MyUSBDevice IsNot Nothing Then
                        If MyUSBDevice.IsOpen Then
                            If MyUSBWriter IsNot Nothing Then
                                If MyUSBDevice.ControlTransfer(MyUSBSetupPacket, i, 4, lTXSize) Then 'query how much data device can accept
                                    If lTXSize = 4 Then
                                        lDevMaxDataSize = i(0)
                                        Debug.Print("Device can accept maximum " & lDevMaxDataSize & " byte(s)")
                                        If lDevMaxDataSize > 0 Then
                                            lDevWait = 0
                                            lTXSize = TXWritePos - TXReadPos
                                            If lTXSize < 0 Then lTXSize += TXFIFOSIZE
                                            If lTXSize > 0 Then
                                                If lTXSize > lDevMaxDataSize Then lTXSize = lDevMaxDataSize
                                                If (TXReadPos + lTXSize) > TXFIFOSIZE Then lTXSize = TXFIFOSIZE - TXReadPos + 1
                                                If MyUSBWriter.Write(TXFIFO, TXReadPos, lTXSize, 2000, lTXSize) = ErrorCode.Success Then
                                                    TXReadPos = (TXReadPos + lTXSize) Mod TXFIFOSIZE
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                    Try
                        Threading.Thread.Sleep(lDevWait)
                    Catch ie As Threading.ThreadInterruptedException
                        Exit Try
                    End Try
                Else 'there is nothing to send. Go to sleep till something gets written to TXFIFO
                    Try
                        Threading.Thread.Sleep(Timeout.Infinite)
                    Catch ie As Threading.ThreadInterruptedException
                        Exit Try
                    End Try
                End If
                If bkThExit Then Exit While
            End While
        Catch x As Threading.ThreadAbortException
            Exit Try
        End Try
    End Sub

End Class


Чет Мар 15, 2012 1:44 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: PIC32 (и не само) - USB комуникация?
Що за език е това 8O


Чет Мар 15, 2012 12:01 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: PIC32 (и не само) - USB комуникация?
BASIC


Чет Мар 15, 2012 12:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
VB.NET
Мога да го преведа на C#, ама то е същото, само с друг синтаксис.


Чет Мар 15, 2012 12:11 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: PIC32 (и не само) - USB комуникация?
Не бе, аз проблем нямам ти на какво пишеш :) Но бях останал с впечатлението че ползваш http://www.libusb.org това, а то нищо познато не виждам в кода. Каква библиотека все пак ползваш, нещо от .НЕТ-а явно... ?


Чет Мар 15, 2012 4:12 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
Ето тая библиотека ползвам:
http://libusbdotnet.sourceforge.net/V2/Index.html

Това е просто "надграждане" върху libusb, за работа с dotnet.


Чет Мар 15, 2012 4:20 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
Аз затова мразя OpenSource проекти. Щото тоя писал нам кво си, пък после решил да пише друго, пък то уж универсално, пък всъщност не съвсем, пък от него се нароили куп други проектчета, пък тая компилация актуална ли е, пък коя е актуалната, пък чий вариант е... ИЗДИВЯХ! :)

Аз тотално не можах да схвана в края на краищата какво да използвам от всичкото това. 0.1, 1.0, libusb-win32, libusbK, libusbdotnet, и т.н.

Само прочетете началната страница на libusb. Става ли ви ясно какво да ползвате под windows? Щото на мен не.

И накрая хванах това (libusbdotnet), направих inf файл, инсталирах драйвър, опитах, и то тръгна. Толкоз. Устройството ми се разпознава като LibUsb (заради драйвера), но до колкото разбирам, и WINUSB драйвер да му сложа, пак ще го разпознае.

Накратко, аз искам да ползвам libusb 1.0 под windows, заради вградената асинхронна поддръжка. Кой конкретно драйвер да инсталирам (линк)? И кой конкретно API dll от ниско ниво да ползвам (линк)? Нямам проблем да пренапиша PC частта отначало, още повече че вече разбрах принципа и кое какво прави. Искам да мина с минимално количество външни библиотеки - разбирайте - само драйвера и API dll-а. Трябва ми за VB.NET или C#.


Чет Мар 15, 2012 5:28 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: PIC32 (и не само) - USB комуникация?
Аз си ползвам онази 0.1.... нищо че функциите са блокиращи, пускам ги в отделни инишки като се налага. Само че не ползввам .нет. Рекох да погледна все пак, ама http://www.libusb.org/ ми дава 502 bad gateway, при тебе отваря ли се ?


Пет Мар 16, 2012 12:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
И при мен не се отваря, още от вчера.

За .NET има създаден готов интерфейс към LibUSB1.0. Казва се monolibusb (http://libusbdotnet.sourceforge.net/V2/ ... a2fa67.htm), и до колкото разбирам би трябало да работи и под linux и прочие. Хавата е там, че се твърди че libusb1.0 е "thread safe". А иначе и аз ще му използвам блокиращите функции. Един четящ и един пишещ thread, и всичко би трябвало да е наред. Ако искам да ползвам неблокиращите функции, така или иначе трябва да спазвам един куп правила за да работи в multithread среда (например ако имам 2 устройства и 2 програми едновременно работещи с всяко от тях). Блокиращите функции на 1.0 вътрешно са направени така че да спазват тия правила.

...само дето, предвид че имам работещо решение вече, не знам дали си струва да продължавам да се балтавя. От вчера все чета, чета...


Пет Мар 16, 2012 1:07 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
Чудото вече работи. Настройват му се филтри, маски, "Tima quаnta", скорост и всичко останало отвън.
Обаче се появи още една питанка, а именно, има ли пречка да ползвам интеръпти в bootloader-а? В смисъл, в момента боотлоадера е подкаран без интеръпти и си работи, но какво би станало ако го пусна с интеръпти, при положение че и двата, които евентуално ще ползва боотлоадера се ползват и от фирмуера?


Съб Апр 07, 2012 1:58 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
Отговорих си сам на въпроса. Няма проблем с интеръптите в bootloader-a. Никакъв.


Съб Апр 07, 2012 11:23 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC32 (и не само) - USB комуникация?
Вече върви, настройват се филтри и скорост на CAN шината, подкарах и bootloader в USB Bulk. Остава да поизчистя още малко кода и ще кача целия проект тук. Ползва интеръпти и в bootloader-а, и в програмата без никакъв проблем, без никаква намеса от моя страна, освен в linker script-а на програмата. Bootloader-а си тръгва и с оригиналния, както в Debug, така и в Release режим.

Аз доволен. :)


Чет Апр 12, 2012 12:16 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: PIC32 (и не само) - USB комуникация?
Можеш да го преместиш в Проекти и Споделяне

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Чет Апр 12, 2012 6:51 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 52 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни