2012-03-29 4 views
1

私は、シリアルポート上のグリッパーと通信するためのC++プログラムを作成しています。符号なしの文字連結

"unsigned char [8]"タイプのバッファを送信する必要がありますが、この8バイトのうち4つはキーボードから入力され、2はCRCで計算されます。

したがって、8バイトのunsigned charの1つのバッファでいくつかの部分を連結するにはどうすればよいですか?例えば

DLENCMDdataCRCの労働組合がある{0x05,0x01,0x00,0x01,0x20,0x41,0xFF,0x41}

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}; 
---- 

は、どのように私はこのバッファを得ることができますか?

答えて

3

この:

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

か 'バッファ[0] = DLEN [0];バッファ[1] = CMD [0]。 std :: copy(begin(data)、end(data)、buffer + sizeof DLEN + size of CMD)。 std :: copy(begin(CRC)、end(CRC)、buffer + size of DLEN + size of data + sizeof data); '(別々の行に分割されます) – bames53

0

あなたは、バッファ内の適切な場所に適切なフィールドを取得するには、ビットシフト、<<>>演算子を使用することができます。 buffer |= (DLEN << 7);

よう

何かちょうどあなたのバッファがすべて0の最初にクリアされていることを確認します。 8文字のunsigned char型配列から始める

+0

これは動作しません。すべての型は文字の配列です。配列をビットシフトすることはできません。 – bames53

1

代替の解決策はこれです。

データを挿入するために他のメソッドに渡す必要がある場合は、updateCRC(&buffer[6])のように参照渡しします。メソッドシグネチャでは符号なしのcharポインタを使用します。入力のそれぞれのサイズを尊重すると、結果は両方の世界の中で最高です。バッファを別々の文字列のように扱い、後で単一の配列にマージする必要はありません。

0

hmjdの答えの私のバージョン:

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);