Шестнадцатеричный массив не складывается, как ожидалось

У меня есть массив шестнадцатеричных значений, как указано ниже.

byte Hexa_Val[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

Я хочу увеличить этот массив с самого конца. Как и в, перейдите от {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} до {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, а затем увеличьте значение рядом с ним до {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} и продолжите. Приращение должно идти так, как показано ниже.

{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
.
.
.
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}
.
.
.
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}
.
.
.
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}

Код который я придумал таков

byte Hexa_Val[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

void setup() {
  Serial.begin(115200);
}

void loop() {

  Hexa_Val[7] = Hexa_Val[7] + 1;

  if(Hexa_Val[7] = 0xFF){
    Hexa_Val[6] = Hexa_Val[6] + 1;
    Hexa_Val[7] = 0x00;    
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF)){
    Hexa_Val[5] = Hexa_Val[5] + 1;
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;      
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF)){
    Hexa_Val[4] = Hexa_Val[4] + 1;
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;
    Hexa_Val[5] = 0x00;       
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF)){
    Hexa_Val[3] = Hexa_Val[3] + 1;
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;
    Hexa_Val[5] = 0x00;
    Hexa_Val[4] = 0x00;        
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF)){
    Hexa_Val[2] = Hexa_Val[2] + 1;
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;
    Hexa_Val[5] = 0x00;
    Hexa_Val[4] = 0x00;
    Hexa_Val[3] = 0x00;         
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF) && (Hexa_Val[2] = 0xFF)){
    Hexa_Val[1] = Hexa_Val[1] + 1;
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;
    Hexa_Val[5] = 0x00;
    Hexa_Val[4] = 0x00;
    Hexa_Val[3] = 0x00;
    Hexa_Val[2] = 0x00;         
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF) && (Hexa_Val[2] = 0xFF)  && (Hexa_Val[1] = 0xFF)){
    Hexa_Val[0] = Hexa_Val[0] + 1;
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;
    Hexa_Val[5] = 0x00;
    Hexa_Val[4] = 0x00;
    Hexa_Val[3] = 0x00;
    Hexa_Val[2] = 0x00;
    Hexa_Val[1] = 0x00;           
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF) && (Hexa_Val[2] = 0xFF) && (Hexa_Val[1] = 0xFF)  && (Hexa_Val[0] = 0xFF)){
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;
    Hexa_Val[5] = 0x00;
    Hexa_Val[4] = 0x00;
    Hexa_Val[3] = 0x00;
    Hexa_Val[2] = 0x00;
    Hexa_Val[1] = 0x00;
    Hexa_Val[0] = 0x00;           
  }

  //to find out what I am sending 
  for( byte a=0; a<8; a++ ) {
    Serial.print(Hexa_Val[a], HEX);
  }
  Serial.println(); 

  delay(500);

}

Но это просто дает мне нули на последовательном мониторе. Если я просто оставлю первые два оператора IF

byte Hexa_Val[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

void setup() {
  Serial.begin(115200);
}

void loop() {

  Hexa_Val[7] = Hexa_Val[7] + 1;

  if(Hexa_Val[7] = 0xFF){
    Hexa_Val[6] = Hexa_Val[6] + 1;
    Hexa_Val[7] = 0x00;    
  }

  if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF)){
    Hexa_Val[5] = Hexa_Val[5] + 1;
    Hexa_Val[7] = 0x00;
    Hexa_Val[6] = 0x00;      
  }

  //to find out what I am sending 
  for( byte a=0; a<8; a++ ) {
    Serial.print(Hexa_Val[a], HEX);
  }
  Serial.println(); 

  delay(500);

}

Приращение будет начинаться с третьего значения справа. Что-то вроде

00000200
00000300
00000400
00000500
00000600
00000700

Как мне заставить его увеличиться, как я уже упоминал в самом начале? Почему код распознает 0xFF как ноль?

, 👍1

Обсуждение

Ваше второе (и следующее) "если" сравнивает "Hexa_val[7]" с 0xFF, но первое уже сбросило его до 0., @the busybee

Боже, мне не терпится написать ассемблерный код, который делает это без ветвления., @Kwasmich


1 ответ


Лучший ответ:

2

Здесь есть несколько проблем:

если(Hexa_Val[7] = 0xFF)

Прежде всего, = является оператором присваивания. Вы устанавливаете Hexa_Val[7] в 0xFF. Если вы хотите сравнить для равенства, вы должны использовать ==.

Вторая проблема-значение 0xff никогда не будет отображаться, потому что вы заменяете его нулем. Затем этот байт будет считать 0xfd, 0xfe, 0x00, пропуская 0xff. Если вы хотите посчитать 0xff, то условие должно быть Hexa_Val[7] == 0, т. е. инкремент Hexa_Val[6] только после Hexa_Val[7] переполнен.

Третья проблема, ваша вторая, если тест приходит слишком поздно. В этот момент Hexa_Val[7] уже сброшен. Вы должны проверить Hexa_Val[6] переполнение только в рамках предыдущего теста.

Со всем этим исправлено:

Hexa_Val[7] = Hexa_Val[7] + 1;
if (Hexa_Val[7] == 0) {
  Hexa_Val[6] = Hexa_Val[6] + 1;
  if (Hexa_Val[6] == 0) {
    Hexa_Val[5] = Hexa_Val[5] + 1;
  }
}

Если вы не хотите писать 8 вложенных условий (что довольно громоздко), вы можете вместо этого выполнить цикл по массиву в обратном направлении, увеличивая каждый элемент по очереди, и выйти из цикла, как только приращение не переполнится:

for (int i = 7; i >= 0; i--) {
    if (++Hexa_Val[i] != 0) break;
}

Если вы не возражаете, чтобы массив был обратным, вы также можете обрабатывать весь массив как одно 64-битное число и просто увеличивать его, как вы бы увеличивали любое целое число. Но тогда вам придется распечатать массив в обратном порядке, начиная с элемента mast:

union {
    uint64_t number;
    byte bytes[8];
} Hexa_Val = { .number = 0 };

void loop() {
    // Increment the array.
    Hexa_Val.number++;

    // Print out.
    for (int i = 7; i >= 0; i--) {
        if (Hexa_Val.bytes[i] < 0x10) Serial.write('0');
        Serial.print(Hexa_Val.bytes[i], HEX);
        Serial.write(' ');
    }
    Serial.println(); 

    delay(500);
}
,