|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 10:01 pm
PIC32 (и не само) - USB комуникация?
| Автор |
Съобщение |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 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 |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: PIC32 (и не само) - USB комуникация?
Подкарах го с thread (не backgorundworker), който пускам още при връзването. Той гледа буфера и ако има нещо се стреми да го изпрати. Ако изпрати всичко или в буфера няма нищо, заспива. При всяко следващо писане в буфера го събуждам, и той пак си върши там каквото върши. Като го докарам до приличен външен вид ще го кача тук. Стана точно както исках. Хем не товари компютъра, хем си върши работата когато трябва да я свърши, хем като се заизлиза от програмата не се куми докато се затвори. Намерих пълното щастие, демек. 
|
| Сря Мар 14, 2012 9:07 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 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 |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
 Re: PIC32 (и не само) - USB комуникация?
Що за език е това 
|
| Чет Мар 15, 2012 12:01 pm |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
 Re: PIC32 (и не само) - USB комуникация?
BASIC
|
| Чет Мар 15, 2012 12:06 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: PIC32 (и не само) - USB комуникация?
VB.NET Мога да го преведа на C#, ама то е същото, само с друг синтаксис.
|
| Чет Мар 15, 2012 12:11 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
 Re: PIC32 (и не само) - USB комуникация?
Не бе, аз проблем нямам ти на какво пишеш  Но бях останал с впечатлението че ползваш http://www.libusb.org това, а то нищо познато не виждам в кода. Каква библиотека все пак ползваш, нещо от .НЕТ-а явно... ?
|
| Чет Мар 15, 2012 4:12 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: PIC32 (и не само) - USB комуникация?
Ето тая библиотека ползвам: http://libusbdotnet.sourceforge.net/V2/Index.htmlТова е просто "надграждане" върху libusb, за работа с dotnet.
|
| Чет Мар 15, 2012 4:20 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 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 |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
 Re: PIC32 (и не само) - USB комуникация?
Аз си ползвам онази 0.1.... нищо че функциите са блокиращи, пускам ги в отделни инишки като се налага. Само че не ползввам .нет. Рекох да погледна все пак, ама http://www.libusb.org/ ми дава 502 bad gateway, при тебе отваря ли се ?
|
| Пет Мар 16, 2012 12:51 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 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 |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: PIC32 (и не само) - USB комуникация?
Чудото вече работи. Настройват му се филтри, маски, "Tima quаnta", скорост и всичко останало отвън. Обаче се появи още една питанка, а именно, има ли пречка да ползвам интеръпти в bootloader-а? В смисъл, в момента боотлоадера е подкаран без интеръпти и си работи, но какво би станало ако го пусна с интеръпти, при положение че и двата, които евентуално ще ползва боотлоадера се ползват и от фирмуера?
|
| Съб Апр 07, 2012 1:58 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: PIC32 (и не само) - USB комуникация?
Отговорих си сам на въпроса. Няма проблем с интеръптите в bootloader-a. Никакъв.
|
| Съб Апр 07, 2012 11:23 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: PIC32 (и не само) - USB комуникация?
Вече върви, настройват се филтри и скорост на CAN шината, подкарах и bootloader в USB Bulk. Остава да поизчистя още малко кода и ще кача целия проект тук. Ползва интеръпти и в bootloader-а, и в програмата без никакъв проблем, без никаква намеса от моя страна, освен в linker script-а на програмата. Bootloader-а си тръгва и с оригиналния, както в Debug, така и в Release режим. Аз доволен. 
|
| Чет Апр 12, 2012 12:16 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
 Re: PIC32 (и не само) - USB комуникация?
Можеш да го преместиш в Проекти и Споделяне
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Чет Апр 12, 2012 6:51 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|