如何将值存储在结构数组中? - 阿杜诺乌诺

How can I store values in an array of structs? - Arduino Uno

我正在尝试创建一个数组结构,其中每个索引都有自己的一组属性。例如,我希望 channels[0].name 有自己的名称,而 channels[1].name 也不同。

每次我有一个新的输入,旧的被遗忘并重复显示新的。我真的很感激一些提示。

部分代码:


#include <Wire.h>
#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
 #define LIMIT 26
 
 struct protocol {
  String name;
  char character;
  int values;
  int minimum;
  int maximum;
};

void create_channels() {
String details;
struct protocol channels[LIMIT];

int i = 0;

do {
       byte b = Serial.available();
        if (b != 0)
        {
          details = Serial.readStringUntil('\n');
          details.trim();
          if (details.startsWith("C")) {
            Serial.print("Channel description: ");
            Serial.println(details);
            channels[i].name = details;
           for (i=0; i < LIMIT; i++) {
            channels[i].name = details;
            Serial.println(channels[i].name);
            }

          } else if (details.startsWith("V")) {
            
          } else if (details.startsWith("X")) {
            
          } else if (details.startsWith("N")) {
            
          }
           else {
            Serial.println("Invalid character");
          }
        }
      } while (1);
}

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  Serial.begin(9600);
  Serial.setTimeout(10);
  lcd.setBacklight(7);

create_channels();


}

void loop() {
 
}

这是结果:

Channel description: CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
CAMain
Channel description: CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary
CBSecondary

对于您从串行输入中读取的每个字符串,您将使用该字符串填充整个 channels 数组并将其打印出来 'LIMIT' 次。

尝试删除 for 循环 - 并将其替换为:

channels[i++].name = details 

然后将 while(1); 条件更改为 while(i < LIMIT);,以便在 channels 数组已满时退出循环。