Toon posts:

[Kylix, C] C code omzetten naar Kylix

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met een probleem dat ik weer iets dat in C geschreven is om moet zetten naar kylix. Het gaat om data uitwisseling tussen mijn programma en een driver.

Nu moet ik dit omzetten:

C:
1
unsigned char *buf

Nu heb ik al het een en ander geprobeerd. Buf van het type PChar, PByte of PByteArray.

Maar het moeilijke is dat het wel kan merken zonder foutmeldingen maar dat de data overdracht niet goed gaat.

Daarom wil ik eerst weten of het 100% goed is wat ik doe.

Wat er trouwens met die Buf moet gebeuren is dat er bijv 3 waarden van bytes aan moet worden toegekend. Er zal dus gebruik moeten worden gemaakt van een array van 3 elementen.

Kan iemand mij aangeven wat de beste methode is voor dit in Kylix?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Wat komt er dan wel in te staan?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik kan via de driver bijvoorbeeld de firmware opvragen. Die geeft dan in 2 variabelen de versie terug (de ene is de HI en de andere de LO). Nu krijg ik 0 en 4 terug en het zou moeten zijn 1 en 03.

Verwijderd

Topicstarter
Misschien dat het voor de meeste nog niet helemaal duidelijk is. Daarom zet ik hier ff de code waar het nu allemaal om draait:

Delphi:
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
  PI2C_OP = ^TI2C_OP;
  TI2C_OP = packed record
    Count: LongInt;  // C ==> int
    Buf: PByte;      // C ==> unsigned char *buf
  end;



var I2COp: PI2C_OP;
    IOCTLStatus: Integer;
    HI, LO, CommandID: Byte;
    Buffer: array[0..3] of Byte;
begin
  I2COp := AllocMem(Sizeof(TI2C_OP));
  try
    I2COp^.Buf := @Buffer;
    Buffer[0] := $5E;
    I2COp^.Count := 4;
    IOCTLStatus := ioctl(fd, IOCTL_PIC_I2C_RECV, I2COp);
    if IOCTLStatus < 0 then
      ShowMessage('Error : ' + IntToStr(errno));

    CommandID := PByteArray(I2COp^.Buf)^[1];
    HI := PByteArray(I2COp^.Buf)^[2];
    LO := PByteArray(I2COp^.Buf)^[3];

    ShowMessage('CommandID: ' + IntToStr(CommandID) + ' ' + IntToStr(HI) + ' ' + IntToStr(LO));
  finally
    FreeMem(I2COp);
  end;


Ik krijg nu als waarden:

CommandID ==> 3 (dit zou moeten zijn 0xD0)
HI == > 0 (dit zou moeten zijn 01)
LO ==> 4 (dit zou moeten zijn 03)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Weet je zeker dat die int in C een longint moet zijn i.p.v. integer? Want zo te zien zit je nu 2 bytes te ver te lezen (een integer is meestal 2 bytes, en commandid is een 3, en die had bij LO moeten staan (2 bytes verschil))

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
In de C header file staat het als volgt gedefineerd:

C:
1
2
3
4
5
typedef struct
{
  int count;
  unsigned char *buf;
} i2c_op;

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Een integer i.p.v. een longint gebruiken dus

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Creepy schreef op 11 augustus 2003 @ 15:27:
Een integer i.p.v. een longint gebruiken dus
Volgens de help is een LongInt exact hetzelfde als een Integer (en het maakt trouwens geen verschil in mijn programma)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Bekijk de struct dan eens byte voor byte en kijk waar de juiste data zit, en pas aan de hand hiervan je record aan. En waarom benader je als eerste element van je array element 1 i.p.v 0?

[ Voor 43% gewijzigd door Creepy op 11-08-2003 15:50 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Creepy schreef op 11 augustus 2003 @ 15:48:
Bekijk de struct dan eens byte voor byte en kijk waar de juiste data zit, en pas aan de hand hiervan je record aan. En waarom benader je als eerste element van je array element 1 i.p.v 0?
Je bedoelt die struct in C? Ik heb weinig tot geen kennis van C dus dat wordt lastig :)

En ik lees element 1 uit (CommandID), omdat dat de 0e element het PIC_ID bevat en driver geeft als 2e, 3e en 4e element respectievelijk het volgende terug: commandid, data byte 1, databyte 2.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 11 augustus 2003 @ 15:58:
[...]
Je bedoelt die struct in C? Ik heb weinig tot geen kennis van C dus dat wordt lastig :)
Ik bedoelde het record in Kylix (slechte woorkeuze van mijn kant dus ;) ). Als je zeker weet wat db1 en db2 moeten zijn moet er vast wel uit te halen zijn of de juiste info wle in het record zit, en zo ja waar.
En ik lees element 1 uit (CommandID), omdat dat de 0e element het PIC_ID bevat en driver geeft als 2e, 3e en 4e element respectievelijk het volgende terug: commandid, data byte 1, databyte 2.
Ah ok, ik werd ff afgeleid door het gebruik van buffer en getypcaste buf en dacht dat je met 1 het eerste element wilde benaderen ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Inmiddels werkt het allemaal. Wat bleek nu? De documentatie van het bedrijf waar wij de driver software en pic software hebben laten maken was nou niet echt super helder.

Er stond beschreven hoe het pakket er uit ziet wat verstuurd moet worden via het I2C protocol naar de pic. Nu stond daar ook een byte bij waar het pic id nummer moest worden meegegeven.

Echter nu blijkt dat dat automatisch door de driver gebeurt. Dit heeft dat bedrijf niet aangegeven waardoor wij dus een 1 dag verkeerd gezocht hebben.

Maar het werkt nu dus perfect en met de code bleek toch niks fout te zijn.
Pagina: 1