3

多くの ADC からサンプリングする 1 つのマイクロコントローラーがあり、非常に低いビットレートで測定値を無線で送信しており、帯域幅が問題になっています。

現在、各 ADC は 10 ビットのデータしか提供せず、そのデータは 16 ビットの整数で格納されています。最初の測定値がビット 0、2 番目の測定値がビット 10、3 番目の測定値がビット 20 などになるように、決定論的な方法でそれらをパックする簡単な方法はありますか?

さらに悪いことに、マイクロコントローラーはリトルエンディアンであり、反対側のコンピューターのエンディアンを制御することはできません。

編集:これまでのところ、@ MSNの回答が一番気に入っていますが、コメントに返信します

@EvilTeach:正確なビットパターンが役立つかどうか、またはテキストのみで最適にフォーマットする方法はわかりませんが、考えてみます.

@Jonathan Leffler: 理想的には、8 つの 10 ビット値を 10 個の 8 ビット バイトにパックします。処理が簡単になる場合は、4 バイトの 3 つの値または 8 バイトの 6 つの値で解決します (ただし、2 つは私と同じですが、「無駄な」ビットの量は同じです)。

4

3 に答える 3

4

ビット 0 と 31 を使用してエンディアンを決定し、中間に 3 つの 10 ビット値をパックします。一致するエンディアンをテストする簡単な方法の 1 つは、ビット 0 を 0 に、ビット 31 を 1 に設定することです。受信側で、ビット 0 が 1 の場合、ビット 31 が 0 であることをアサートし、エンディアンを交換します。それ以外の場合、ビット 0 が 0 の場合、ビット 31 が 1 であることをアサートし、3 つの値を抽出します。

于 2010-04-05T01:52:08.993 に答える
3

ビットフィールドを使用できますが、機械語内の順序は定義されていません。

つまり、次のようになります。

struct adc_data { 
unsigned first :10;
unsigned second :10; 
unsigned third :10; 
};

編集:ジョナサンのおかげで修正されました。

于 2010-04-05T01:36:58.027 に答える
0

エンディアンネスについて行う最も簡単なことは、送信用に1つを選択することです。伝送ストリームにビットをパックするには、一度に10ビットずつシフトインし、その中にあるビット数を追跡​​するアキュムレータ(この場合は少なくとも17ビット)を使用します。バイトを送信するときは、アキュムレータから1バイトを引き出し、カウントから8を引き、アキュムレータを8だけシフトします。ここでは「送信」を大まかに使用します。おそらく後で送信するためにバッファに格納します。

たとえば、送信がリトルエンディアンの場合、アキュムレータの上部にある10ビット(MSビット)をシフトインし、バイトを下部からプルします。例:2つの値aとbの場合:

Accumulator     Count
(MS to LS bit)   
aaaaaaaaaa      10      After storing a
aa              2       After sending first byte
bbbbbbbbbbaa    12      After storing b
bbbb            4       After sending second byte

レセプションも同様の開梱作業です。

于 2010-04-05T02:24:21.007 に答える