0

次の構造をセットアップし、addr-array の内容を出力する必要があります。

typedef struct
{
    uint8                   len;
    uint8                   ch;
    uint8                   cmd;
} ATTR_PACKED
RESPONSE_R;

typedef struct
{
    RESPONSE_R          rspr;
    uint8               addr[SIZEOF_ADDR];
} ATTR_PACKED
RESPONSE_ADDR;

ただし、私の現在の解決策は、変数の周りのスタックを破損していますrspr。私の知る限り、それはaddr配列であり、設定が間違っているためです。しかし、そうであるかどうか、またその理由はわかりません。関数を終了するときにエラーメッセージが表示されるまで、デバッガーでは問題ないように見えます。

//this code has to be ansi-c
void    OnResponse(uint8 *pPkt){

RESPONSE_R rspr;
//pPkt[0] holds the lenght of the received response, which equals to sizeof(rspadr)
//before this was ok, but I guess, now it is not, because RESPONSE_R stores just the
//pointer, not the whole array
memcpy(&rspr,pPkt,pPkt[0]-sizeof(rspr));            

switch(rspr.cmd){
 case CMD_READ_ADDR:
   RESPONSE_ADDR rspadr;
   memcpy(&rspadr,pPkt,pPkt[0]);
   //nevermind the cout, this is for debug only     
   cout << "ADDR: " << endl;                
   printf("%02x",rspadr.addr[0]);
   break;
 default:
   break;
 }
}

rspadr正しいデータを取得するのに、なぜこのコードでスタックが破損するのでしょうか?

編集

memcpy送信された応答バイトのサイズを保持するpPktため、サイズを決定するために使用します。pPkt[0]しかし、おそらくここにポイントがあり、構造体のサイズを直接使用するように変更する必要があります。ただし、ここでの主な問題ではありません。

pPkt[]主なトラブルメーカーは、 RESPONSE_ADDR のように、これらの構造体の 1 つに配列がある場合、データをバッファから構造体に変換するにはどうすればよいかということです。

pPkt[128]配列の生ビュー

[0x0] = 0x09
[0x1] = 0x00
[0x2] = 0x02
[0x3] = 0x00
[0x4] = 0x16
[0x5] = 0x01
[0x6] = 0x02
[0x7] = 0x03
[0x8] = 0x04

[0xa] = 0x00
[0xb] = 0x00
[0xc] = 0x00
...
[0x127] = 0x00

これは私が得る入力です。ここで、セクション (pPkt[2] で表される) によって決定されるルーチンと、アドレスを取得するためのオブジェクトRESPONSE_Rを選択するために、オブジェクトをセットアップする必要があります。cmdRESPONSE_ADDR001601020304

rsp.cmdやのようなものを使用できるようになりたいと思いrspadr.addr[0]ます。

4

2 に答える 2

2

この行は疑わしいようです:

memcpy(&rspr,pPkt,pPkt[0]-sizeof(rspr));  

の3番目の引数memcpyは、コピーするバイト数であり、のサイズを超えることはできませんRESPONSE_R

もしかして

memcpy(&rspr,pPkt,sizeof(rspr));  

アップデート2

何も必要としないこのソリューションはどうmemcpyですか?

const RESPONSE_R* p_rspr = (const RESPONSE_R*)pPkt;

switch(p_rspr->cmd){
 case CMD_READ_ADDR:
   const uint8* addr = pPkt+sizeof(RESPONSE_R);
   //nevermind the cout, this is for debug only     
   cout << "ADDR: " << endl;    
   for (uint i = 0; i != p_rspr->len; ++i)            
     printf("%02x", addr[i]);
   break;
 default:
   break;
 }
于 2012-11-21T11:13:02.820 に答える
2

以下のステートメントを再確認していただけますか。

RESPONSE_R rspr;
memcpy(&rspr,pPkt,pPkt[0]-sizeof(rspr));    

間違った方法でコピーしようとしているようです。

于 2012-11-21T11:16:42.337 に答える