2015-10-20 18 views
5

次の構造体をchar配列に変換して、シリアルポート経由で送信できるようにしようとしています。memcpyを使用して構造体をchar配列に変換する

char b[sizeof(struct foo)]; 
memcpy(b, &dvar, sizeof(struct foo)); 

しかし、私は私が最初にそれを考えたchar配列

0x0A 0xFF 

でこれらの末尾の値を取得何らかの理由:私は、次を使用して、char配列に変換

struct foo 
{ 
    uint16_t voltage; 
    char ID ; 
    char TempByte; 
    char RTCday[2]; 
    char RTCmonth[2]; 
    char RTCyear[2]; 
    char RTChour[2]; 
    char RTCmin[2]; 
    char Sepbyte; 
}dvar = { 500, 'X' , '>' , "18" , "10" , "15" , "20" , "15" , '#'}; 

値を取得していたのは、文字配列にキャストしたときに効果的に文字列にキャストしていたので、NULL '\ 0'だったからです。

助けていただければ幸いです。現代のプロセッサで

おかげ

+4

構造体「datadownload」はどこにあり、サイズは何ですか? – Gopi

+1

"末尾の値"とはどういう意味ですか?配列の内容をどのように調べますか?あなたはCやC++をプログラミングしていますか?セマンティクスは異なる可能性があります。無関係なノートでは、代わりに組合を使用してもらえますか? –

+2

http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member – Lundin

答えて

1

私はあなたに8ビットマイクロコントローラを使用している疑いのある疑惑を持っています! b[sizeof(foo)]b[sizeof(foo)+1] を印刷してデバッグできます。これは2文字になります。 気付いた場合は、これらを参照するべきではありません。char配列の範囲外です。

構造体に未使用の要素を追加したり、最終メンバーのサイズを増やしたりすると、char配列は ' \ 0 ' - コンパイラはおそらくこれを実行したいと考えます。

また、@Melebiusが示しているようにポインタ割り当てを行います。

4

、はsizeof(構造体データのダウンロード)は32ビット境界に配置する必要があります。あなたのデータ構造のサイズは8文字+ 1短い(16ビット)整数です。コンパイラは、構造体のサイズに2つの文字を追加して、それを正しく割り当てることができるようにする必要があります。 シリアル回線を介して通信を行い、送信する内容を正確に把握しているので、シリアル回線を介して送信する正確なバイト数を指定することもできます。2 +/* 1 short */+ 8(8バイト)である。

関連する問題