2012-03-29 15 views
1

Ich erstelle ein C++ - Programm für die Kommunikation mit einem Greifer an einer seriellen Schnittstelle.unsigned char Verkettung

Ich muss einen Puffer vom Typ "unsigned char [8]" senden, aber von diesen 8 Bytes, 4 sind über die Tastatur eingegeben, und 2 sind die CRC, berechnet zu der Zeit.

Also, wie kann ich mehrere Stücke in einem einzigen Puffer von 8 Bytes unsigned char verketten?

Zum Beispiel:

unsigned char buffer[8]; 
---- 
unsigned char DLEN[1]={0x05}; 
---- 
unsigned char CMD[1]={0x01}; 
---- 
unsigned char data[4]={0x00,0x01,0x20,0x41}; 
---- 
unsigned char CRC[2]={0xFF,0x41}; 
---- 

wie kann ich diesen Puffer: {0x05,0x01,0x00,0x01,0x20,0x41,0xFF,0x41}, dass die Vereinigung von DLEN ist, CMD, data und CRC?

Antwort

3

Dieses:

buffer[0] = DLEN[0]; 
buffer[1] = CMD[0]; 
buffer[2] = data[0]; 
buffer[3] = data[1]; 
buffer[4] = data[2]; 
buffer[5] = data[3]; 
buffer[6] = CRC[0]; 
buffer[7] = CRC[1]; 
+0

Oder 'buffer [0] = DLEN [0]; Puffer [1] = CMD [0]; std :: copy (Beginn (Daten), Ende (Daten), Puffer + Größe von DLEN + Größe von CMD); std :: copy (Beginn (CRC), Ende (CRC), Puffer + Größe von DLEN + Größe von CMD + sizeof Daten); '(Auf separate Zeilen aufgeteilt, natürlich) – bames53

0

Sie Bitverschiebung verwenden können, die << und >> Betreiber, die entsprechenden Felder an die richtigen Stellen im Puffer zu erhalten.

So etwas wie buffer |= (DLEN << 7);

So stellen Sie sicher, dass Ihr Puffer gelöscht wird alle 0 Erste zu sein.

+0

Dies wird nicht funktionieren. Alle Typen sind Arrays von Zeichen. Sie können ein Array nicht bitweise verschieben. – bames53

1

Eine alternative Lösung ist folgende:

mit einem unsigned char Array von 8 Zeichen beginnen.

Wenn Sie es an andere Methoden übergeben müssen, um darin Daten einzufügen, übergeben Sie es als Referenz wie folgt: updateCRC(&buffer[6]) mit der Methodensignatur, die einen vorzeichenlosen Zeichenzeiger nimmt. Unter der Annahme, dass Sie die jeweiligen Größen der Eingaben respektieren, ist das Ergebnis das Beste aus beiden Welten. Sie behandeln den Puffer so, als wären sie separate Strings, und müssen ihn anschließend nicht in ein einzelnes Array zusammenführen.

0

Meine Version von hmjd Antwort:

buffer[0] = DLEN[0]; 
buffer[1] = CMD[0]; 
std::copy(begin(data),end(data),buffer+sizeof DLEN+sizeof CMD); 
std::copy(begin(CRC) ,end(CRC) ,buffer+sizeof DLEN+sizeof CMD+sizeof data);