![](/img/trans.png)
[英]Add bit padding (bit shifting?) to 10bit values stored in a byte array
[英]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.