Seite 1 von 1

struct ueber RS232 senden

Verfasst: 21. Februar 2007 09:10
von bloedi
Ich bin Anfängerin mit QT und C++, darum meine Fragen werden immer trivial.

Code: Alles auswählen

struct{
			BYTE a;				
			WORD b;
			BYTE d;
			DWORD c;
		}m_session;

	char  buffer[512];
	 m_session.a=12;
	m_session.b=345;	
	m_session.d=45;
	m_session.c=678;
	memcpy(buffer,&m_session,sizeof(m_session));
	m_serial->writeData(buffer,sizeof(m_session));
ich empfange diese struktur m_session und hier ist das Ergebniss in dezimal Form

012 255 089 001 045 181 018 000 166 002 000 000 und von dieser Werte in Binär-Form kann ich mein m_session nicht "wiederherstellen"

und sizeof(m_session)=12 WARUM???


Wenn ich umschreibe meine struct so:

Code: Alles auswählen

struct{
			BYTE a;
			BYTE d;
                         WORD b;
			DWORD c;
		}m_session;
dann ist sizeof(m_session)=8 so wie ich es erwarte. WARUM kommt zu diese Unterschiede? Wie wird Speicherplatz für mein struct allokiert??
und nach dem senden ich empfange die Werte auch in die richtige Ordnung

012 045 089 001 166 002 000 000

Die ersten 2 Bytes sind a und d , dann die anderen 2 Bytes 089 001
in binär form 101011001 ergibt 345 usw...



Also ist memcpy nicht gut für mein Problem...

Wie kopiere ich genau die Elemente einer struct in einem char *()?
Ich glaube ich verstehe nicht ein paar grundsätzliche Dinge...

DANKE für eure Hilfe?

Verfasst: 21. Februar 2007 09:56
von Christian81
sizeof() gibt die wirkliche Grösse des Speicherblocks in Speicher an. Er ist hier 12 weil der Compiler die Strukturmitglieder automatisch an der n-Bytegrenze aligned. Dies dient zur Optimierung der Zugriffe der CPU auf den Speicher.
-->
BYTE1 -> 0
1 frei
WORD -> 2,3
BYTE2 -> 4
5,6,7 frei
DWORD -> 8,...11

wobei

BYTE1 -> 0
BYTE2 -> 1
WORD -> 2,3
DWORD -> 4,...7

Unter msvc kann man das mit #prgma pack() beeinflussen -> http://msdn.microsoft.com/library/defau ... r_pack.asp

Verfasst: 21. Februar 2007 10:37
von bloedi
Alles klar! Danke jetzt habe ich verstanden aber mein Problem bleibt ungelöst...was benutze ich anstatt memcpy()?wie sende ich die struct?



jetz gerade versuche ich die Bytes zu basteln von einem WORD(or DWORD or LWORD) und dann alle Elemente der structur werden ein char * buffer "ausfüllen".
und diese buffer sende ich RS232 port

Beispiel hier:

Code: Alles auswählen

BYTE com_main::cast_4_byte(DWORD *data_in, BYTE *data_out){
00585 
00586     data_out[0] = (BYTE) (*data_in);
00587     data_out[1] = (BYTE)((*data_in) >> 8);
00588     data_out[2] = (BYTE)((*data_in) >> 16);
00589     data_out[3] = (BYTE)((*data_in) >> 24);
00590 
00591     return 4;
00592  }
//-----------------------------------------------------------------------------
hat jemand eine andere Idee, die eleganter ist??


CIAO Carmen

Verfasst: 21. Februar 2007 10:42
von Christian81
bloedi hat geschrieben:Alles klar! Danke jetzt habe ich verstanden aber mein Problem bleibt ungelöst...was benutze ich anstatt memcpy()?wie sende ich die struct?
Was gibts denn noch für ein Problem? Ich sehe hier auch keinen Grund memcpy nicht zu benutzen...

Verfasst: 21. Februar 2007 11:27
von bloedi
Doch es ist ein Problem, da meine "echte" struct 60 Elemente hat und zu einem Mikrokontroller(MSP430) geschickt werden sollte, um ihn zu configurieren.Mit dem MSP habe ich ein Protokoll er erwartet von mir genau 8 Bytes und er wird der erste Byte für den Wert von a verstehen , die nächsten 2 Bytes sind für b dann.... und die letzten 4 für d .

Mit diesem Parameter bestimme ich auf welchen Samplerate soll abgestatet werden, wie viele Kanäle möchte ich abtasten, oder irgend welche ClockSettings, oder der StartBlock/ stopBlock auf SD -card etc etc
Der MSP430 hat keine Aahnung über "freie "Bytes ...

Bin ich klar geworden?
mfg carmen

Verfasst: 21. Februar 2007 11:47
von bloedi
GELÖST!!!! :P



Danke Christian ich habe nur vor Definition meiner Struktur dieses Code eingefügt:

Code: Alles auswählen

#pragma pack(1)
und es ist alles in Ordnung auch mit memcpy()...Eigentlich nicht memcpy war
ein Problem, sondern dieses "packing alignment for structure"

Ich habe dein Link erst jetzt geöffnet...:oops:
DANKE du warst echt eine große Hilfe!!!