3

MSP430コントローラーで実行されるmodbusプロトコルのコードを書いています。応答バッファ (グローバル) は、処理された要求に対する応答がシリアル UART で送信される 8 ビット データの配列です。さて、私の問題は、生成された応答が異なるデータ型の組み合わせを持っていることです。つまり、uint8、uint32、float です。グローバル応答バッファを使用してこのデータを送信する方法は?

float の場合、memcpy を使用してみましたが、これはうまく機能しているようです。より効率的で良い方法はありますか?フレームサイズが大きいため(20〜30バイトなど)。ここに私がやろうとしたことのデモがあります

int main() 
{ unsigned char buff[8]; //Global buffer 

float temp[2]; //temp buffer to store response values 

temp[0] = 0x00ef2212; 

memcpy(buff, temp, 8); 

printf("buff[0]= %u \n buff[1]= %u\n buff[2] = %u\n buff[3]= %u\n", buff[0],buff[1],buff
[2],buff[3]); 

return 0; 
} 
4

3 に答える 3

1

簡単な実装は、応答構造を作成し、応答構造をバッファーに memcpy することです。

struct response {
   uint8 bytedata;
   uint32 intdata;
   float  floatdata;
};
memcpy((void *)uartbuffer,(void *)&response,sizeof(response));

注:プロトコルで作業しているように見えるため、エンディアンはすでに指定されている可能性があり、特定のエンディアンタイプに従ってアイテムをパックする必要がある場合があり、単純なmemcpyは機能せず、データタイプをパックする必要がある場合があります.

于 2012-03-22T05:25:51.993 に答える
1

キャスティングと割り当てで。例えば

uint8 *globalbuf;
uint32 myval;
*(uint32*)globalbuf = myval;

myval を globalbuf の最初の 4 バイトにコピーします。

アラインメントの問題に注意してください。プラットフォーム上で、その型サイズの倍数でないアドレスに値を割り当てたり、アドレスから値を読み取ったりすることは、違法であるか、コストがかかる場合があります。たとえば、アドレス 0、4、8 などは、uint32 を配置するのに適した場所です。

これは、globalbuf がナイス ラウンド アドレスで始まることを前提としています。

于 2012-03-22T04:27:46.947 に答える
0

ユニオンを使用して同じ範囲のメモリを異なるデータ型に表すことを検討してみませんか?

typedef union {
    unsigned char buff[8];
    float temp[2];
} un;

un global_buffer;
// give global_buffer.buff some data.
un local_buffer;

local_buffer = global_buffer; 
// handle local_buffer.temp
于 2012-03-22T07:01:59.203 に答える