Сохранить начальный ноль 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»
Пожалуйста, помогите мне. Спасибо.
@Ian, 👍1
2 ответа
Лучший ответ:
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]);
можете попробовать;
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);
- Очень простая операция Arduino Uno Serial.readString()
- Как преобразовать строку в массив байтов
- Использование прерываний с RC522
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- Понимание того, почему следует избегать «String» и альтернативных решений
Привет, мне нужно сохранить в строку, потому что я снова преобразую ее в десятичное число. Если я воспользуюсь вашей рекомендацией, могу ли я преобразовать ее в десятичную?, @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];
, @gabonatord[0] взят из char id[16]?, @Ian
Я отредактировал код, чтобы он соответствовал вашей ситуации., @gabonator
Спасибо, сэр. ваша рекомендация сработала так, как я хочу., @Ian