Как преобразовать массив байтов в одну переменную
В этом коде я беру данные TID (20 байт по 160 бит) в виде массива в соответствии с документацией, и они работают правильно и получают выходные данные RFID-тегов.
Теперь мне просто нужно ваше руководство: как мне преобразовать массив из 20 байт в одну переменную или в тип данных двойной длины? или другие. Потому что мне нужно отправить его на сервер базы данных MySQL для дальнейшей обработки.
Я попробовал следующий код, который работает нормально
byte x[10] = "450210921";
long result = atol(x);
Serial.print("long value of the byte is: ");
Serial.println(result);
но когда я помещаю приведенный выше код в свой основной код, не получаю никаких ошибок и не получаю требуемого вывода.!
void setup()
{
Serial.begin(115200);
}
void loop()
{
byte response;
byte myTID[20]; //TID составляют 20 байт
byte tidLength = sizeof(myTID);
//Читаем уникальный идентификатор тега
response = nano.readTID(myTID, tidLength);
if (response == RESPONSE_SUCCESS)
{
for(byte x = 0 ; x < tidLength ; x++)
{
if(myTID[x] < 0x10) Serial.print("0");
/*temp[x]=(myTID[x], HEX);*/
//Заменяем значения во временную переменную
temp[x]=myTID[x];
Serial.print(temp[x]);
}
/*byte x[10] = "450210921";*/
//Преобразуем весь массив в одну длинную переменную
long result = atol(temp);
Serial.print("long value of the byte is: ");
Serial.println(result);
}
else
Serial.println("Failed read");
}
@Eza, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы не можете преобразовать 20 байт в длинные. Отправьте его как строку шестнадцатеричных значений. Байт занимает два шестнадцатеричных символа, поэтому вы отправите строку из 40 символов, которую можно просто декодировать обратно в байты.
char str[sizeof(myTID) * 2 + 1];
const char* hex = "0123456789ABCDEF";
for (int i = 0; i < sizeof(myTID); i++) {
str[i * 2] = hex[(myTID[i] >> 4)];
str[i * 2 + 1] = hex[(myTID[i] & 0x0F)];
}
str[sizeof(str)] = 0;
Serial.println(str);
Оно работает! Спасибо, а что насчет этого for(byte x = 0; x <sizeof(myTID); x++) { content.concat(String(myTID[x] < 0x10 ? " 0" : " ")); content.concat(String(myTID[x], HEX)); } контент.toUpperCase(); softSerial.print(содержимое);, @Eza
Строка не очень хорошая, @Juraj
Не могли бы вы объяснить, что струна плохая!!, @Eza
https://hackingmajokblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/, @Juraj
- Как подключить Sparkfun M6E Nano UHF Rfid-считыватель и ESP8266 NodeMCU 0.1
- Как публиковать запросы HTTP POST на моем веб-сайте?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
- MFRC522: прошивка неизвестна
Не существует такой вещи, как одна переменная размером 160 бит. Я *думаю*, что вы хотите отформатировать байты как строку (и здесь есть много вопросов по этому поводу)., @Majenko
Хорошо @Majko, но есть ли способ перенести весь массив в MySQL в одну ячейку таблицы с помощью nodemcu?, @Eza
Я понятия не имею, что такое MySQL, но вы можете взять каждый байт массива, превратить его в текстовое представление шестнадцатеричной пары, объединить их все в строку и использовать эту строку., @Majenko
https://arduinoprosto.ru/q/53258/how-to-store-an-rfid-tag-number-in-a-string, @Majenko
Есть несколько простых ошибок: 1) "atol(x)" должно быть "atol(tmp)", 2) но тогда "tmp" должно заканчиваться нулем, 3) что означает, что он слишком короткий. И так далее., @Mikael Patel