C ++ Arduino библиотека, возвращающая массив целых с неправильными значениями - PullRequest
0 голосов
/ 04 декабря 2018

В настоящее время я пишу библиотеку для Arduino, используя C ++, чтобы взять шестнадцатеричную строку RFID из 8 символов из считывателя и преобразовать эту строку в байты, обрабатывая каждые два символа как часть одного байта, так что «1234ABCD» становится 0X12, 0X34, 0XAB, 0XCD.Эти байты затем преобразуются в целочисленные значения, которые их представляют, так что предыдущими значениями становятся 18, 52, 171 и 205 соответственно.Эти целые числа затем будут помещены в массив и возвращены вызывающей стороне.Поскольку строка RFID является шестнадцатеричной, я умножаю целочисленное значение первого символа в каждой паре на 16.

Библиотека C ++:

int AccessPortal::hexToInt(char character) {
  if(int(character) -  '0' < 10) {
    return int(character)  - '0';
  }
  else {
    if(isupper(character)) {
      return int(character) - '7';
    }
    else {
      return int(character) - 'W';
    }
  }
}

int* AccessPortal::getByteArray(std::string uid) {
  int byteArray[4];
  int intArray[8];
  int counter = 0;
  for(int i = 0; i < 8; i++) {
    if(i  % 2 == 0) {
      intArray[i] = hexToInt(uid[i]) * 16;
    }
    else {
      intArray[i] = hexToInt(uid[i]);
    }
  }
  for(int i = 1; i < 8; i = i + 2) {
    byteArray[counter] = intArray[i - 1]  + intArray[i];
    counter ++;
  }
  return byteArray;
}

Код Arduino:

 void setup() {
      // put your setup code here, to run once:
      AccessPortal access(); //constructor 
      int *h;
      h = access.getByteArray("1234ABCD");
      for(int i = 0; i < 4; i++) {
        Serial.println(h[i]);
      } 
    }

    void loop() {
      // put your main code here, to run repeatedly:

    }

Однако, когда я запускаю программу, в последовательный порт выводится следующее:

1073741740
1073741680
1073670364
1075849820

Это странно, потому что, когда я запускаю функции из библиотеки C ++ отдельно и печатаю результаты в терминал, значенияверны.Я предполагаю, что это означает, что ошибка происходит в способе возврата массива и / или доступа к нему в коде Arduino, однако я не уверен.

1 Ответ

0 голосов
/ 04 декабря 2018

Как уже говорили другие, указатель на локальную переменную становится недействительным, как только локальная переменная выходит из области видимости, поэтому ее не следует возвращать.Вместо этого вы можете создать объект ByteArray, который вы можете возвращать по значению из своих функций.Пример использования ArduinoSTL:

#include <ArduinoSTL.h>
#include <string>
#include <cstdlib>

struct ByteArray {
    uint32_t m_value;
    bool m_valid;

    // convert hex string to uint32_t value
    ByteArray(const std::string& uid) :
        m_value(std::strtoul(uid.c_str(), nullptr, 16)),
        m_valid(true)
    {
        if(uid.size()!=8) m_valid = false;
    }

    // converting assignment operator
    ByteArray& operator=(const std::string& uid) {
        m_value = std::strtoul(uid.c_str(), nullptr, 16);
        if(uid.size()==8) m_valid = true;
        else m_valid = false;
        return *this;
    }

    // subscript operator to access the individual bytes (as ints)
    int operator[](size_t x) const {
        if(x>3) return -1;
        return (m_value>>((3-x)*8))&0xFF;
    }
};

struct AccessPortal {
    // change the getByteArray signature to this
    ByteArray getByteArray(const std::string&);
};

ByteArray AccessPortal::getByteArray(const std::string& uid) {
    // return by value - copy elision
    return ByteArray(uid);
}

void setup() {
    AccessPortal access; //default constructing
    ByteArray h = access.getByteArray("1234ABCD");

    Serial.println(h.m_value); // dec: 305441741  hex: 1234ABCD

    for(int i = 0; i < 4; i++) {
        Serial.println(h[i]); // dec: 18, 52, 171, 205  hex: 12, 34, AB, CD
    }
}

void loop() {
    //
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...