1

uart を介してネットワークにデータを送信する関数 UartSend() があります。引数 unsigned char と整数を取ります

UartSend(unsigned char *psend_data,int length);

この関数を介して構造体を送信したい

#pragma pack(push, 1)
struct packet
{

    int a;
    char b[3];
    ...

}PacketData;

#pragma pack(pop)

このデータを UartSend 経由で送信するために、この構造を unsigned char に変換する方法は? ありがとう..

4

5 に答える 5

5

サイズが正しい場合は、単純に にキャストできunsigned char *ます。

PacketData pkt;
UartSend((unsigned char *)&pkt, sizeof(pkt));

unsigned char *このコンテキストでは、実際にはバイトを意味します。

もちろん、接続の反対側では、再キャストするプログラム ロジックPacketData(または同様の構造体) を組み込む必要があります。

編集:ただし、@WhozCraig がコメントで指摘しているように、宛先プラットフォームがソース プラットフォームと同一でない場合は、アライメントの問題を考慮する必要があることに注意してください(または、GNU 拡張機能に依存する必要があります__packed__) 。

于 2013-02-22T07:48:09.697 に答える
0

ユニオンを使用して、構造体またはunsignedchar配列の形式でデータにアクセスできます。このようにして、直接キャストで発生するエイリアシングの問題を回避できます。

于 2013-02-22T07:57:11.560 に答える
0

チップ

  1. バイトアライメント / パック 1。最高のパフォーマンスが得られるように、自然なバイト アラインメントを使用することをお勧めします。SUN と AIX「自然なバイト配置」に敏感です。
  2. バイト シーケンス変換。通常、送信側はビッグ エンディアンで送信し、受信側は BYTES をローカル エンディアンに変換します。少し (WINDOWS、LINUX) / 大きな (AIX、SUN、HP)
于 2013-02-22T08:47:36.697 に答える
0

int がワード境界に収まるようにデータ構造が整列されます。これは、ターゲットの場合は 32 ビットまたは 64 ビットになる可能性があります。

これが起こらないように、構造体を次のように再編成できます。

{
 int var6;
 unsigned char var1;
 unsigned char var2;
 unsigned char var3[2];
 unsigned char var4;
 unsigned char var5[8];
 unsigned char var7[4];
};
于 2015-12-02T04:53:20.290 に答える
0

構造体には、各要素を整列させるために追加のバイトを含めることができます。これらの余分なバイトは、使用しているコンパイラ/プラットフォームによって異なります。その結果、やりたいことができなくなる可能性があります。

joを実行する関数を作成することをお勧めします。構造から各要素を引き出して、個別に送信する必要があります。値を受け取り、それらを関数に戻すには、2 つ目の関数が必要です。

エンディアンも問題になる可能性があることに注意してください。ネットワーク バイト順序関数を使用して、整数値が標準形式で送信されるようにしてください。システムが異なるタイプの場合、浮動小数点値には何らかの追加の変換ステップが必要になる場合があります。

于 2013-02-22T08:01:35.617 に答える