[英]Arduino Uno - serial.read to a struct of bits
這個問題在這篇文章之后: arduino-如何從serial.read()提供結構
首先,我要感謝Sol Arnu在下面顯示的他以前的代碼。 請注意,代碼是有效的。 到目前為止最好的嘗試。 即使我認為一點都沒有發送到表。 現在,我可以打印“ 1”。 但是,如果我更改了發送的頁面(從2改為1),則沒有任何變化。 這部分xb = val1 | (val2<<8); Serial.print(xapage);
xb = val1 | (val2<<8); Serial.print(xapage);
讓我感到困惑。 它是否比較2個var位並將結果通過並集放置在struct的實例中?
我沒有說這是一個Arduino Uno(8位,內存和寄存器)。 你知道發生了什么嗎?
#include <SoftwareSerial.h>
#define PACKED __attribute__((__packed__))
SoftwareSerial PORTone(8, 9); // port 1
SoftwareSerial PORTtwo(10, 11); // port 2
PACKED union {
PACKED struct {
unsigned int val1:
1; // (0,1)
unsigned int val2:
4; // 10 choices (4 bits)
unsigned int val3:
3; // 5 choices (3 bits)
unsigned int val4:
2; // 3 choices (2 bits)
}
*PtrStr;
uint8_t val_table[2];
uint16_t b;
}
*MegaUnion;
//*********************************SETUP***************
void setup() {
Serial.begin(9600);
PORTone.begin(9600);
}
//**********************************LOOP***************
void loop() {
while(PORTone.available()>0) {
delay(100);
for(int i = 0; i<=4; i++) {
for(int i = 0; i<=3; i++) {
for( int j = 0; j<=3; j++) {
int inByte = PORTone.read();
*MegaUnion.struct.val1[j] = inByte; // error: 'union<anonymous>' has no member named 'val1'
}
// I should that too
// u_structTable x;
// x.b = val1 | (val2<<8);
// Serial.print(x.a.page);
}
}
// what is coming from the table
Serial.print( (*MegaUnion).page);
}
}
我應該回答MichaëlRoy(希望我可以繞過第二個話題)。 感謝您的寶貴答復。 這似乎是我要測試的另一種方法。
“編輯”我還糾正了尼克·加蒙(Nick Gammon)很好地發現的一個大錯誤,以便更好地了解該主題。 我的錯。
也許這個聯合涵蓋了所有類型,並且因為它使用匿名結構,所以需要的點更少:)
#define PACKED __attribute__((__packed__))
PACKED union {
PACKED struct
{
unsigned int page:1; // (0,1)
unsigned int cric:4; // 10 choices (4 bits)
unsigned int crac:3; // 5 choices (3 bits)
unsigned int croc:2; // 3 choices (2 bits)
};
PACKED struct
{
uint8_t val1;
uint8_t val2;
};
uint8_t val_table[2];
uint16_t b;
}MegaUnion;
MegaUnion.val1 = PORTone.read();
MegaUnion.val2 = PORTone.read();
請記住,您的頁面位域占據了聯盟中最年輕的一位,因此要將其設置為one
您需要編寫MegaUnion.val1 = 1
或MegaUnion.val_table[0] = 1
或MegaUnion.b = 1
原始代碼:
while(PORTone.available()>0) {
volatile unsigned int val1, val2, val3, val4;
for(int i = 0; i<=4; i++){
val1 = PORTone.read();
val2 = PORTone.read();
val3 = PORTone.read();
val4 = PORTone.read();
}
PORTone.available()>0
確保單個字節可用於讀取。 您正在讀取20個字節。 幾乎可以肯定的是,其中的19個將為-1(0xFFFF)。
我不明白為什么您要讀取這五個值五次。
無需使val1,val2,val3和val4易失,因為它們沒有與中斷服務程序共享。
修改后的代碼:
while(PORTone.available()>0) {
delay(100);
for(int i = 0; i<=4; i++){
for(int i = 0; i<=3; i++){
for( int j = 0; j<=3; j++) {
int inByte = PORTone.read();
*MegaUnion.struct.val1[j] = inByte;
我看不到你在這里做什么,除了把東西放在一起並希望最好。 一旦發現單個字節可用,您現在在內部循環中讀取80個字節。 變量名稱中不包含單詞“ struct”。 您有兩個循環變量,都稱為i
。
如果您不介意描述以及如何訪問中斷服務程序,那將是非常不錯的!
什么中斷服務程序? 除非您正在使用中斷(您似乎並沒有這樣做),否則您不需要volatile
。
到目前為止,我僅經歷過,結構成員可能無法通過var獲得其價值。 無論如何,只要我收到並分享(10位),就無需使用結構。 一串4個字就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.