JNA Passing struktur ved Reference Hjelp

stemmer
4

Jeg prøver å bruke JNA å snakke over en USB-enhet koblet til datamaskinen. Ved hjelp av Java og en DLL som ble gitt til meg. Jeg har problemer med skrivefunksjon:

C-kode:

typedef struct {
    unsigned int id;
    unsigned int timestamp;
    unsigned char flags;
    unsigned char len;
    unsigned char data[16];
} CANMsg;

CAN_STATUS canplus_Write(
        CANHANDLE handle, //long
        CANMsg *msg
    );

Java Equivalent:

public class CANMsg extends Structure{
    public int id = 0;
    public int timestamp = 0;
    public byte flags = 0;
    public byte len = 8;
    public byte data[] = new byte[16];
}

int canplus_Write(NativeLong handle, CANMsg msg);

Jeg har bekreftet at jeg kan åpne og lukke anordningen. Den nære krever NativeLong håndtaket, så jeg antar at CANMsg msg er problemet her. Jeg har også bekreftet at enheten fungerer når testet med C bare kode.

Jeg har lest JNA dokumentasjonen grundig ... tror jeg. Noen tips. Takk alle.

Publisert på 01/06/2009 klokken 13:49
kilden bruker
På andre språk...                            


4 svar

stemmer
1

Jeg også er å ha et problem med canplus_write grensesnitt. Så langt alt peker mot en bug i den medfølgende driver - Jeg tror ikke den nye USBCANPlus modulen har gått gjennom en skikkelig testfasen enda. Fra koden kan jeg se at du bruker en eldre versjon av driveren til å begynne med, som datafelt skal bestå av 8 byte (som er det maksimale antallet databyte i en CAN-melding). Hva jeg har funnet gjennom mine egne undersøkelser er at sjåføren ikke klarer å konvertere dataene til ASCII-tegn dvs. hvis du ønsker å sende 01 02 03, det vil overføre ASCII tegn '1' '2' '3' til modulen i stedet av '0' '1' '0' '2' '0' '3' - kan du bruke USB avlytting programvare for å kontrollere dette. Jeg er i kontakt med FTDI teknisk støtte i øyeblikket, og jeg håper de vil snart gi ut en oppdatert versjon av driveren.

Håper dette løser problemet også, vil jeg anbefale å komme i kontakt med dem også.

Svarte 06/08/2009 kl. 16:48
kilden bruker

stemmer
1

Er len størrelsen på struktur? Hvis ja; da verdien du har gitt er galt. Gjør dette:

CANMsg msg = new CANMsg();
msg.len = msg.size();
Svarte 29/07/2009 kl. 17:44
kilden bruker

stemmer
1

Jeg vet ikke mye om JNA, men et annet språk dataoverføring mislykkes vanligvis når pekere bli overført som en enkel adresse.

Hvis det er dataene den peker på at du vil sende tvers, er det antagelig en pakkemetode samtale der inne et sted. Hvis du ikke skrive det selv, kanskje det er generert av denne JNA rammeverket ... Kan være nyttig å legge det til spørsmålet ditt.

Kartlegging C røye til Java byte er også litt rart for meg, men jeg kan se hvor det kunne komme fra. Hvilket operativsystem du kjører denne koden på?

Svarte 01/06/2009 kl. 17:48
kilden bruker

stemmer
0

Jeg vet ikke noe om dll du bruker, men CANMsg.len er mer enn sannsynlig henviser til hvor mange byte er faktisk i byte [] data. Så du ville enten må holde styr på hvor mye du skrive til byte [16] data matrise eller beregne len basert på avslutnings null char (forutsatt String ASCII er dataene). Jeg tror ikke CANMsg.size () eksisterer eller er implementert som Rusty ovenfor antyder.

Svarte 10/06/2010 kl. 13:17
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more