Сохранить начальный ноль HEX в строку RFID RC522 Arduino

Я использую RC522 для считывания RFID-карт. Все происходит до тех пор, пока HEX не будет начинаться с 0, и я не смогу сохранить его в строку. Но если я распечатаю его в Serial, все будет хорошо. Вот мой код:

#include <SPI.h>
#include <MFRC522.h>
#include <stdlib.h>

#define RST_PIN         9
#define SS_PIN          10

String inStringHex = "";

MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
}

void loop() {
  // Ищем новые карты
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial())
  {
    //Serial.print("UID карты:");
    for (byte i = 0; i < 4; i++) {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      inStringHex += String(mfrc522.uid.uidByte[i], HEX);
    }

    Serial.println();
    Serial.println(F("Hex normal"));
    Serial.print(inStringHex);
    Serial.println();
    Serial.println();

    inStringHex = "";
    delay(5000);
  }
}

Вот что отображается на последовательном мониторе:

Я хочу, чтобы строка под «Hex Normal» была «04292e5a», а не «4292e5a»

Пожалуйста, помогите мне. Спасибо.

, 👍1


2 ответа


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

1

String(mfrc522.uid.uidByte[i], HEX) означает, что вы хотите преобразовать число в представление шестнадцатеричной строки. Если вы передадите 4 в качестве входного параметра, оно преобразуется в «4». , а не «04». Вам необходимо применить аналогичный подход, который вы использовали при печати значения через UART. Например:

if (String(mfrc522.uid.uidByte[i] < 0x10) 
  inStringHex += " ";
inStringHex += String(mfrc522.uid.uidByte[i], HEX);

Лично я бы рекомендовал переключиться со строк на статические буферы (потому что у Arduino слишком мала память для использования динамического выделения, и могут возникнуть проблемы с нехваткой памяти из-за ее фрагментации):

char id[16]; 
sprintf(id, "%02x%02x%02x%02x", mfrc522.uid.uidByte[0], mfrc522.uid.uidByte[1], mfrc522.uid.uidByte[2], mfrc522.uid.uidByte[3]);
,

Привет, мне нужно сохранить в строку, потому что я снова преобразую ее в десятичное число. Если я воспользуюсь вашей рекомендацией, могу ли я преобразовать ее в десятичную?, @Ian

Да, конечно, вы получите ту же строку, и для преобразования вы можете использовать strtol с основанием 16. Но если вы хотите преобразовать только четыре байта в одно длинное целое число, есть гораздо [более простой способ](https://forum .arduino.cc/index.php?topic=71030.0), @gabonator

Я попробую ваше предложение. Спасибо, сэр., @Ian

беззнаковый длинный результат = 0; результат |= (long)mfrc522.uid.uidByte[0] << 24; результат |= (long)mfrc522.uid.uidByte[1] << 16; результат |= (long)mfrc522.uid.uidByte[2] << 8; результат |= (long)mfrc522.uid.uidByte[3];, @gabonator

d[0] взят из char id[16]?, @Ian

Я отредактировал код, чтобы он соответствовал вашей ситуации., @gabonator

Спасибо, сэр. ваша рекомендация сработала так, как я хочу., @Ian


1

можете попробовать;

for (byte i=0; i < uidLength; i++)
{
  Serial.print(uid[i] < 0x10 ? " 0" : "");
  Serial.print(uid[i], HEX);
  if (uid[i] < 0x10) inStringHex += "0";
      inStringHex += String(uid[i], HEX);
} Serial.println(); Serial.println(inStringHex);
,