簡體   English   中英

如何將10位值分配給字節數組?

[英]How can I allocate 10bit values to a byte array?

我需要通過串行端口從微控制器發送數據,並希望盡量減少發送的數據,因為該數據是從ADC讀取的10位數據。 所以我想,我會使用工會。 這就是我得到的:

union fortybit
{
 struct
 {
  unsigned int a : 10;
  unsigned int b : 10;
  unsigned int c : 10;
  unsigned int d : 10;
 } tenbits;
 unsigned char bytes[5];
};

現在,我將像這樣發送數據:

fortybit fb;
for (int i = 0; i < 640; i++)
{
 fb.tenbits.a = 512;
 fb.tenbits.b = 512;
 fb.tenbits.c = 512;
 fb.tenbits.d = 512;
 Serial.write(fb.bytes, 5);
}

這會導致出現一些奇怪的讀數,這些讀數是周期性的,並且某些值是正確的,但其中大多數是完全錯誤的。

我可能做錯了什么? 什么是正確的方法?

絕對不要在任何外部表示形式中使用位域。 由於您通過串行線路發送存儲位字段的原始字節,因此這成為外部的。

無法知道在串行端口接收端的計算機以相同的方式解釋您的struct 它可能具有不同的字節順序,位打包成的不同本機整數大小(這可能意味着不同的填充)或其他內容。

它根本不是便攜式的。

您應該以更可控的方式執行此操作,也許可以通過手動計算所需外部表示形式的每個字節來進行。 這稱為序列化 ,這是一件好事。

它不是那樣難於打包來改變自己。 這樣的事情應該可以解決問題:

int A[4] = { 0x1,0x1,0x1,0x1 };
int B[5];

long long x=0;
for(int i=0; i<4; i++) {
    x |= A[i] << (10*i);
}
for(int i=0; i<5; i++) {
    B[i] = x & 0xFF;
    x >>= 8;
}

printf("%02x %02x %02x %02x %02x\n",B[0],B[1],B[2],B[3],B[4]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM