Permalänk
Medlem

Skicka en struct med write()?

Jag har en liten fundering om det går på något sätt att skicka allt innehåll i en struct samtidigt till write(), eller måste man skriva varje enskilt objekt,
write(fd, &frame->flag, 1) ?

Ytterliggare en fråga är hur man skickar ett bitmönster i little endian i C? dvs skicka den minst signifikanta biten först, detta ska skickas över en RS485 som jag redan har fått att fungera och kopplat en TTY mot.

write() används för att skicka data till TTY:n.

Tack för all hjälp jag kan få.
/Jim

Permalänk

För att skicka hela structen kan du göra såhär:

struct s_t a; /* populate a with data */ write(fd, &a, sizeof(struct s_t));

Permalänk
Medlem

Tusen tack för hjälpen.

Permalänk
Glömsk

Notera att det finns ett portabilitetsproblem att göra sådär. Kom ihåg att olika system hanterar integers på olika sätt. På en vanlig little endian x86-burk kommer det hexadecimala talat 0xaabbccdd skrivas i minnet som 0xdd 0xcc 0xbb 0xaa. Om du däremot skriver på en big endian-burk blir resultatet omvänt. Detta är visserligen inget problem om du enbart kommer använda programmet på "vanliga" burkar, men det är bra att vara medveten om iaf.

Edit: Jag läste nu andra halvan av ditt inlägg och upptäckte att du förmodligen är väl medveten om dessa problem.

För att swappa bytesen i en 32-bit int kan du exempelvis

#define SWAP32 (n) ((((n)&0xff)<<24) | ((((n)>>8)&0xff)<<16) | ((((n)>>16)&0xff)<<8) | (((n)>>24)&0xff))

Edit2: Jag kan uppenbarligen inte läsa idag. Om du vill swappa bits finns det en del kluriga lösningar här: http://graphics.stanford.edu/~seander/bithacks.html#BitRevers...

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

En sak att tänka på är att om din struct innehåller pekare så går det i de flesta fall inte att med korrekt resultat skriva hela structen direkt, utan då får du skriva varje variabel för sig och se till skicka värdet pekarna pekar på istället för adressen.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Ytterligare en sak att tänka på är att din struct kan layoutas i minnet annorlunda på olika arkitekturer, och till och med från olika kompilatorer. Om du inte kan garantera att du byggt programmet som skickar och programmet som läser på samma arkitektur och med samma kompilator, är det inte portabelt att skicka structar på det sättet. Samma gäller om du vill skriva structar direkt till fil, etc.

Permalänk
Medlem

Tack för alla intressanta tips.

Löste problemet med structen och håller för tillfället på med CRC-16 beräkningar.

Har någon mot all förmodan någon intressant kod att länka för CRC-16 beräkningar i C?
Det enda jag hittar är den källkod som följer med i src för Gentoo men jag har ingen aning om man kan använda den eller hur man använder den i userland så att säga.