2016-12-09 5 views
1

問題があります。私の配列にいくつかの値を書いて、私はデバイスとの接続にinaticizeフレームにハンドルを送信したいが、私は構造体から私のデータを拾うときに私が望むよりも別の値を上書きする。構造体の配列の値がまだ変化しています

私のfooがあります。

int handlePackets (struct _PacketData * outputPacket, uint8_t command){ 
    outputPacket->addr = SERIAL; 
    outputPacket->length = 0; 
    outputPacket->cmd = command; 

    switch (outputPacket->cmd) 
    { 
     case CMD_SET_OUTPUT: 
      outputPacket->length = 0x06; 

      outputPacket->data[0] = 0x80; 
      outputPacket->data[1] = 0x3F; 
      outputPacket->data[2] = 0x10; 
      outputPacket->data[3] = 0x40; 
      outputPacket->data[4] = 0x30; 
      return COMM_FRAME_OK; 
    } 
    return COMM_FRAME_OK; 
} 
int sendPacket (struct _PacketData * outputPacket, uint8_t * buffer){ 
int cntr = 0, x; 

buffer[cntr++] = STX; 
buffer[cntr++] = outputPacket->addr >> 24; 
buffer[cntr++] = outputPacket->addr >> 16; 
buffer[cntr++] = outputPacket->addr >> 8; 
buffer[cntr++] = outputPacket->addr & 0xff; 

buffer[cntr++] = outputPacket->length >> 8;    
buffer[cntr++] = outputPacket->length & 0xff; 

buffer[cntr++] = outputPacket->cmd; 

for (x = 0; x < outputPacket->length -1 ; x++) 
{ 
    buffer[cntr++] = outputPacket->data[x];  
} 
crc = calcCrcBuffer (buffer + 1, cntr - 1); 

buffer[cntr++] = (unsigned char) (crc >> 8);  //crc high byte 
buffer[cntr++] = (unsigned char) (crc & 0xff);  //crc low byte 

buffer[cntr++] = ETX; 
return cntr; 
} 

構造

struct _PacketData{ 
uint32_t addr; 
uint16_t length; 
uint8_t cmd; 
uint8_t data[256];}; 

main.cの

int main(void) { 
struct _PacketData * outputOutPack; 

uint8_t tab[256]; 
int i; 

    uint8_t *buffer = tab; 

    handlePackets(&outputOutPack,CMD_SET_OUTPUT); 

    result = sendPacket(&outputOutPack, buffer);} 

は私のFRAMの出力eは私のようなものではありません。データはバッファ[cntr]から値を上書きしますが、理由はわかりません。

出力:

[0] = 0x82 
[1] = 00 
[2] = 0x18 
[3] = 0xb0 
[4] = 0xa5 
[5] = 00 
[6] = 0x6 
[7] = 0x78 
[8] = 0x82 
[9] = 00 
[10] = 0x18 
[11] = 0xb0 
[12] = 0xa5 
[13] = 0x64 
[14] = 0xfe 
[15] = 0x83 

ポジション7は、出力 - > CMDと、次の出力 - >データ、[8-12]が、そのない私の配列である:)

任意の提案?

ありがとうございました

+1

あなたの関数はポインタへのポインタではなく、ポインタへのポインタです。 'struct _PacketData * outputOutPack;'を 'struct _PacketData outputOutPack;'に変更することができます – cmidi

+0

コンパイラの警告をオンにします。コンパイラはhandlePacketsとsendPacketのパラメータ#1の間違ったデータ型について文句を言います。 – Gerhardh

+0

それは動作します! 1つのシンボルと2日間違いを見つけることに失われた。それは私の見落としでしたが、時には別の人がどこに問題があるかを見ています。ありがとうcmidi! – cvanyy

答えて

1

コードをコンパイルすると、次の警告が表示されます。

warning: passing argument 1 of 'handlePackets' from incompatible pointer type 
note: expected 'struct _PacketData *' but argument is of type 'struct _PacketData **' 

問題の理由は、あなたの関数(handlePacketssendPacket)は、ポインタへのポインタではないstruct _PacketDataへのポインタを取るということです。 あなたは、あなたがポインタへのポインタでの機能を提供する場合、基本的に、やっているあなたは、これは未定義の動作につながる、スタック上のポインタ型に割り当てられたメモリを参照解除され、潜在的に何struct _PacketData outputOutPack;

を構造体_PacketData * outputOutPack;を変更する必要がありますあなたのスタックを破壊する。

関連する問題