Хобрук: Ваш путь к мастерству в программировании

Не работает шестнадцатеричный декодер Arduino в строку

Я создаю декодер HEX -> STR, используя ЖК-экран (отображает HEX, а также декодированные значения), клавиатуру (для ввода HEX-кода) и кнопку (нажмите, чтобы декодировать HEX-значения) . Декодер иногда работает, но иногда дает сбои и выдает непредвиденные значения.

#include <Keypad.h>
#include<LiquidCrystal.h>

String hex; // store the hex values
String text; // store the decoded text
int calcButton = 0;

const byte ROWS = 4; 
const byte COLS = 4; 

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'F'},
  {'4', '5', '6', 'E'},
  {'7', '8', '9', 'D'},
  {'A', '0', 'B', 'C'}
};

byte rowPins[ROWS] = {9, 8, 7, 6}; 
byte colPins[COLS] = {13, 12, 11, 10}; 

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
LiquidCrystal lcd(5, 4, 3, 2, A0, A1);

char nibble2c(char c) {
   if ((c>='0') && (c<='9'))
      return c-'0' ;
   if ((c>='A') && (c<='F'))
      return c+10-'A' ;
   if ((c>='a') && (c<='a'))
      return c+10-'a' ;
   return -1 ;
}

char hex2c(char c1, char c2) {
   if(nibble2c(c2) >= 0)
     return nibble2c(c1)*16+nibble2c(c2) ;
   return nibble2c(c1) ;
}

// resets string values and clears screen
void erase() {
  hex = "";
  Serial.println(hex);
  text = "";
  lcd.clear();
  lcd.setCursor(0,0);
}

// decode the hex values
String calculate(String hex) {
  if (hex.length()%2 != 0) {
    lcd.setCursor(0,0);
    lcd.print("No of characters");
    lcd.setCursor(0,1);
    lcd.print("needs to be even");
    delay(2000);
    erase();
  }
  else {
    for (int i = 0; i < hex.length() - 1; i+=2){
      for (int j = 1; j < hex.length(); j+=2){
         text += hex2c(hex[i], hex[j]);
      }
    }
  }
}



void setup() {
  pinMode(A2, INPUT);
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  Serial.begin(9600);
}

void loop() {
  calcButton = digitalRead(A2); // decode button
  char customKey = customKeypad.getKey();

  // if keypad is pressed, add hex values to str
  if (customKey){
    lcd.print(customKey);
    hex += customKey;
    Serial.println(hex);
  }

  // if button is pressed, decode
  if (calcButton == 1) {
    lcd.clear();
    calculate(hex);
    hex = "";
    lcd.print(text);
    text = "";
    delay(1500);
    lcd.clear();
  }
}

Я ввожу 49 и получаю I (что правильно), но когда я ввожу 4949, я ожидаю, что вывод будет II, но он выводит IIII, а когда я ввожу 6F, ожидая o, весь экран размывается и глючит.


Ответы:


1

Проблема здесь:

for (int i = 0; i < hex.length() - 1; i+=2){
  for (int j = 1; j < hex.length(); j+=2){
     text += hex2c(hex[i], hex[j]);
  }
}

Обратите внимание, что вы выполняете итерацию по шестнадцатеричной строке length()*length()/4 раза, комбинируя каждый четный шестнадцатеричный символ из строки с каждым нечетным символом в строке, а не только с тем, который непосредственно следует за ним. Для двузначных шестнадцатеричных строк это работает, потому что есть только один нечетный и один четный символ; для более длинных строк вы получите неправильные результаты.

4949 будет сочетать 4 (#0) и 9 (#1), затем 4 (#0) и 9 (#3) (неправильно!), затем 4 (#2) и 9 (#1) (неверно!), затем 4 (#2) и 9 (#3), что дает вам результат, который должен дать 49494949 вместо 4949.

То, что вы хотите, это просто:

for (int i = 0; i < hex.length() - 1; i+=2){
  text += hex2c(hex[i], hex[i+1]);
}
03.05.2019
Новые материалы

Пять вещей, о которых вы должны ДЕЙСТВИТЕЛЬНО побеспокоиться в связи с ИИ
Несмотря на то, что циркулирует много неточной информации об ИИ, важно исправить частые заблуждения. Многие могут быть обеспокоены тем, что их в конечном итоге заменят роботом, или..

Тестирование ответов на вопросы на основе BERT по статьям о коронавирусе
Введение В настоящее время большая часть мира затронута пандемией COVID-19 . Для многих из нас это означало домашний карантин, социальное дистанцирование, перебои в рабочей среде. Я..

Библиотеки PyTorch и Python для машинного обучения: приложения в здравоохранении с обнимающим лицом…
В сфере машинного обучения Python выделяется благодаря своей универсальности и набору предлагаемых библиотек. Развитие машинного обучения в здравоохранении можно частично объяснить простотой и..

«Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!
«Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!

5 вещей, которые я сделал, чтобы стать профессиональным разработчиком JavaScript
Чтобы стать профессиональным JS-разработчиком: 1. Практикуйтесь в рутине, 2. Работайте над проектами, 3. Придерживайтесь одного языка, 4. Наблюдайте за чужим кодом, 5. Будьте последовательны..

От теории к практике: пошаговое руководство по реализации наивного Байеса
Вы когда-нибудь застревали в проекте классификации, не зная, как точно предсказать результаты для ваших данных? Вы искали более простой и интуитивно понятный алгоритм, который поможет вам достичь..

#093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..