struct met variable-size Array.. mogelijk?

Status
Niet open voor verdere reacties.

minco01

Gebruiker
Lid geworden
4 okt 2007
Berichten
5
Beste allemaal,

Op dit moment probeer ik te communiceren met een device, communicatie verloopt serieel (RS-232, RX, TX, Ground). Het apparaat betreft een Garmin.

De Garmin communiceert door seriaal bytestreams weg te sturen, byte-georienteerde pakketten dus. Deze pakketten hebben onderstaande opbouw (rechtstreeks overgenomen uit de interface specificatie van Garmin);

Bytenumber, Bytedescription, Notes
0, Data Link Escape, ASCII DLE character (16 decimal)
1, Packet ID
2, Packet Data Size, aantal bytes packet data
3 tot n-4, Packet Data, 0 tot 255 bytes
n-3, Checksum
n-2, Data Link Escape
n-1, End Of Text, ASCII ETX character (3 decimal)

Het pakket is dus samenvattend als volgt opgebouwd;
3 byte header
0 tot 255 bytes aan data
3 byte trailer


Nu komt het probleem, ik wil natuurlijk graag de te versturen en ontvangen pakketten gestructureerd opslaan. Mij leek het idee van een struct wel gepast, als volgt bijvoorbeeld;

typedef struct
{
BYTE DLE_1;
BYTE packetID;
BYTE dataSize;
// nu komt het moeilijke
BYTE data[dataSize];
// bovenstaande kan natuurlijk nooit, even pseudo het idee
BYTE checksum;
BYTE DLE_2;
BYTE ETX;
} packet;

Note: 'BYTE' is in win32 slechts een ander woord voor een unsigned char, een positieve 8-bit int dus

Het idee is natuurlijk om de data ook in de struct op te slaan, probleem is echter dat we van tevoren niet weten hoeveel data dit zal zijn.. 0 tot 255 bytes. Het doel is natuurlijk de pakketten gestructureerd op te kunnen slaan om ze zo door te geven aan process functies en dergelijke. Aangezien pakketten telkens byte voor byte verwerkt worden. Had even gekeken naar een vector maar zag dat deze default al wat overhead heeft, zodat we in het geheugen meer bytes in beslag nemen dan dat er eigenlijk data is.

Heeft iemand enig idee hoe dit opgelost kan worden? Mocht ik niet duidelijk genoeg zijn dan hoor ik het graag, licht het probleem graag toe.

Alvast hartelijk bedankt!
 
Laatst bewerkt:
Mogelijkheid 1:

Heb er nog over nagedacht en een eerste mogelijkheid is om in de struct 'pakket' een array 'data' aan te maken met een size van 255 elementen, de maximale pakketgrootte.

Vervolgens zal iedere functie apart uit de struct moeten lezen hoeveel elementen van het 'data' array daadwerkelijk met data gevuld zijn, door de pakket.dataSize uit te lezen.

Beetje omslachtig natuurlijk, het is een oplossing maar betwijfel of het de beste is.
 
Code:
typedef struct
{
BYTE DLE_1;
BYTE packetID;
BYTE dataSize;
// evt dit erachter ?
BYTE data[];
}header;

typedef struct
{
BYTE checksum;
BYTE DLE_2;
BYTE ETX;
} footer;
Misschien zoiets? Lijkt mij zelf logischer
 
echter dien je van het BYTE array ook de size te specificeren als ik het goed heb. Hoe zou dat trouwens moeten met de initialisatie van deze member, beide BYTE arrays doorlopen mbv een pointer en telkens de waarde van de 1 in de ander kopieren?
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan