Toon posts:

[C++] Probleem buffergebruik met de EZUSB (AN21315CS)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een toerenregelaar op de EZUSB (AN21315SC). Deze zit verbonden met een PC via een USB-kabel. Op de PC draait een interface, welke moet communiceren met de USB-kit. Dit moet gebeuren via een buffer. Deze buffer wil ik realiseren via endpoints.
Ik heb een driver, waarin bepaalde methoden staan, die de communicatie verzorgen met deze endpoints vanuit C++. Aangezien endpoints een bulk data opslag zijn, leken de methodes ReadBulkData en WriteBulkData de goede methodes.
Hieronder de methodes:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int CUSBInterface::WriteBulkData(WORD PipeNumber, BYTE *BArray, WORD ByteCnt)
    {
    if (!IsOpen())
        return FALSE;

    void (_stdcall *function)(BYTE, WORD, BYTE*, WORD, WORD &);

    if (!(function = (void (_stdcall *)(BYTE, WORD, BYTE*, WORD, WORD &))GetProcAddress(m_hLibInstance, "WriteBulkData")))
        {
        m_LastSystemError = GetLastError();
        return FALSE;
        }

    (*function)(m_DevNumber, PipeNumber, BArray, ByteCnt, m_LastIOError);

    m_LastSystemError = 0;
    return (m_LastIOError == 0);
    }

int CUSBInterface::ReadBulkData(WORD PipeNumber, BYTE *BArray, WORD ByteCnt)
    {
    if (!IsOpen())
        return FALSE;

    void (_stdcall *function)(BYTE, WORD, BYTE*, WORD, WORD &);

    if (!(function = (void (_stdcall *)(BYTE, WORD, BYTE*, WORD, WORD &))GetProcAddress(m_hLibInstance, "ReadBulkData")))
        {
        m_LastSystemError = GetLastError();
        return FALSE;
        }

    (*function)(m_DevNumber, PipeNumber, BArray, ByteCnt, m_LastIOError);

    m_LastSystemError = 0;
    return (m_LastIOError == 0);
    }


Het probleem is het gebruik van deze methodes, aangezien mij niet duidelijk is welke endpoint bij welke pipe hoort. Ik heb al wel, doormiddel van een for-loop, meerdere waardes geprobeerd voor het pipenummer. Er werd alleen niets uit de endpoint gehaald.
De endpoint wordt vanaf de EZUSB automatisch gevuld als de endpoint vrij is, dus zodra er een request komt van de PC is de data wel aanwezig.

Verwijderd

Waarom geen softwarematige buffer met synchronisatie?

offtopic:
Zit er al de hele tijd om te zeuren :+

Verwijderd

Topicstarter
Aangezien er al een hardwarematige buffer bestaat in het systeem, is het minder snel om een softwarematige oplossing te nemen. Mijn voorkeur gaat dan ook nog steeds uit naar een hardwarematige oplossing. Als dit geen oplossing blijkt te zijn, dan blijkt de softwarematige buffer toch het laatste redmiddel.

Verwijderd

offtopic:
Alleereerst, _Blade_ en ik zitten 2 meter van elkaar vandaan en zijn er al de hele dag over aan het discussieren :+


Ik ben het met je eens dat je altijd zo veel mogelijk hardwarematige oplossingen moet gebruiken wanneer deze aanwezig zijn. Echter, moet het wel zo zijn dat deze ook werkt :D.

Zoals het er nu uit ziet werkt het niet en had ik allang een software variant gebakken.

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 23 juni 2005 @ 13:28:
Ik ben het met je eens dat je altijd zo veel mogelijk hardwarematige oplossingen moet gebruiken wanneer deze aanwezig zijn. Echter, moet het wel zo zijn dat deze ook werkt :D.

Zoals het er nu uit ziet werkt het niet en had ik allang een software variant gebakken.
Ik wil dus duidelijkheid over de hardwarematige oplossing. Omdat het 'misschien' niet werkt, ga ik niet kiezen voor de softwarematige oplossing. Ik wil graag weten of er mensen zijn die meer weten over wat ik wil en of dit ook mogelijk is.

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 13:03

LauPro

Prof Mierenneuke®

Naar mijn idee moet je bij een driver of aansturingssoftware voor dergelijke constructies nooit vertrouwen op de hardware, zeker niet als het gaat om een USB-apparaat dat in beginsel 'plug & play' is waardoor het apparaat elk moment foetsie kan zijn voor je software. De software moet de touwtjes uiteindelijk in handen hebben, niet de hardware.

[ Voor 4% gewijzigd door LauPro op 23-06-2005 13:39 ]

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 05-05 22:23
Begrijp ik het nou goed dat de USB driver een pipe aanmaakt van waaruit je de data moet lezen?

Als dat het geval is moeten die ook geregistreerd worden in het systeem, en kun je ze misschien enummen met een of andere registry functie ( want daarin zouden ze dan moeten staan geregistreerd door de driver )

Hardware buffers zijn goed an cool. Als het echt een pipe is, heb je er ook al software buffers tussen trouwens.

zie hier http://www.keil.com/appnotes/files/apnt_162.pdf ook wat info staan

[ Voor 9% gewijzigd door farlane op 23-06-2005 15:01 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
De endpoint is de buffer, oftewel de pipe waardoor de data verschoven wordt. Alle registers en endpoints zijn in een header file gedefineerd. Het systeem weet dus waar dit zich bevind.

Ik heb momenteel nog geen software buffer ertussen zitten, maar dit zou niet zo'n probleem moeten zijn. Er kan vanaf de PC direct in het RAM-geheugen van de EZUSB geschreven en gelezen worden.

De link die je had bijgevoegd had ik al eerder gezien. Ook heb ik dit al een keer doorlopen, maar zonder resultaat. Ik kon in het menu geen pipes selecteren, ook niet nadat ik GetPipes had aangeklikt. Het is mij dan ook de vraag of de endpoints wel willen.
Pagina: 1