次の構造をセットアップし、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
を選択するために、オブジェクトをセットアップする必要があります。cmd
RESPONSE_ADDR
001601020304
rsp.cmd
やのようなものを使用できるようになりたいと思いrspadr.addr[0]
ます。