簡體   English   中英

Arduino Uno-串行讀取到位結構

[英]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 = 1MegaUnion.val_table[0] = 1MegaUnion.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.

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