ЖК-дисплей с байтовым массивом
при считывании RFID-информации(MIFARE) с помощью Arduino mega и отображении в последовательном мониторе она работает нормально. Но при печати на 2004LCD корректно отображается только одна информация(Значение). В названии другого информационного элемента отображается десятичное число. Не мог бы кто-нибудь помочь в этом деле?
void Price(){
block = 4;
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Аутентификация не удалась: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
status = mfrc522.MIFARE_Read(block, buffer1, &len); // ***Запишите buffer1 в скобке
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Reading failedl: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//Отображение информации о цене...
for (uint8_t i = 0; i < 16; i++)
{
if (buffer1[i] != 32) // если buffer1[i] не равно 32
{
Serial.write(buffer1[i]); //Цена
//lcd.write(buffer1[i]);
Value = buffer1[i];
}
}
Serial.print("/=");
Serial.println(" ");
sscanf(buffer1,"%d",&Value);
lcd.setCursor(0,1);
lcd.println(Value);
}
//==========================================================
void Item(){ //----- Получение и отображение информации о товаре
block = 1;
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Authentication failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
status = mfrc522.MIFARE_Read(block, buffer2, &len);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Reading failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
for (uint8_t i = 0; i < 16; i++) { //
Serial.write(buffer2[i]); // Элемент Отображения
lcd.write(buffer2[i]);
Item_Name=buffer2[i];
}
sscanf(buffer2,"%s",&Item_Name);
//sprintf(buffer2,"%d",&Item_Name);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(Item_Name);// выводит цифры вместо "Fresh Milk 1Lt
}
@Ak Rikas, 👍1
Обсуждение1 ответ
Лучший ответ:
Рассмотрим следующее:
char buffer2[16]; // массив из 16 символов
for (uint8_t i = 0; i < 16; i++) {
do_something_with(buffer2[i]); // обрабатывать по одному символу за раз
}
Здесь у нас есть массив из 16 ячеек, каждая из которых имеет тип char (который, как я
предполагаю, у вас есть). Цикл проходит через массив, обрабатывая по одной
ячейке за раз. Внутри цикла
buffer2[i]
представляет символ
, который обрабатывается в данный момент.
Имейте в виду, что символ
-это всего лишь 8-битное целое число. Каким-то образом
подразумевается, что он предназначен для представления символа, где 32 = ' '
(пространство), 33 = '!'
, 48 = '0'
, 65 = 'A'
и так далее (см. ASCII).
Методы Arduino print()
предполагают, что символ char
(в отличие от int
)
предназначен для отображения в виде символа.
Теперь ваш фактический цикл:
int Item_Name;
for (uint8_t i = 0; i < 16; i++) {
Serial.write(buffer2[i]); // запись символа на последовательный порт
lcd.write(buffer2[i]); // запись символа на ЖК-дисплее
Item_Name=buffer2[i]; // хранить символ в переменной
}
Это приведет к печати содержимого буфера как на последовательный порт, так и
на ЖК-дисплей. Вы бы увидели ожидаемое сообщение на ЖК-дисплее, если
бы у вас не было lcd.clear()
сразу после цикла.
sscanf(buffer2, "%s", &Item_Name);
Это означает “извлечь из буфера2
последовательность непрерывных
небелых символов и сохранить ее в памяти по адресу
переменной ItemName
”. Если буфер содержит “Свежее молоко 1Lt”, то он будет
записывать “Свежее” в эту ячейку памяти. Это 6 байт (5 букв и
завершающий NUL). К сожалению, компилятор выделил только 2 или
4 байта оперативной памяти для хранения ItemName
(в зависимости от модели Arduino),
так что это будет записывать мимо выделенного хранилища, что является типом ошибки
, известной как переполнение буфера. Теперь память вашего Arduino повреждена, и
может случиться все, что угодно.
sprintf(buffer2, "%d", &Item_Name);
Он пытается найти в byffer2
текстовое представление
числа и сохранить его в Item_Name
. Это безопасно, но
имеет смысл только в том случае, если буфер содержит число, записанное в виде текста, чего здесь нет
.
lcd.print(Item_Name);
Это означает, что ЖК-дисплей должен напечатать целое число (а именно Item_Name
). Он
преобразует целое число в десятичный текст и печатает соответствующие цифры
на жидкокристаллическом дисплее.
Предположим, например, что Item_Name
содержит числовое значение
32
(что является ASCII-представлением пространства). lcd.print()
преобразует это в последовательность из двух символов: "3"
и " 2 "
(
десятичное представление 32). Затем он отправит эти символы на
ЖК-дисплей (значения ASCII 51 и 50), и вы увидите текст “32”.
Если вы хотите увидеть текст, содержащийся в буфере, вы можете
либо отправить символы один за другим (как вы уже делали прямо сейчас
lcd.clear ()
) или предоставьте lcd.print()
указатель char*
со
всем сообщением:
lcd.print(buffer2);
Это предполагает, что буфер завершается символом NUL. Если это не так, то вы можете либо использовать метод char-at-a-time, либо изменить свой код, чтобы поместить нулевой терминатор в буфер.
Большое вам спасибо! он работает когда я меняю тип данных buffer2 с байтового массива на символьный, @Ak Rikas
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Печать массива с помощью функции печати и последовательной записи в Arduino Uno
- Как создать массив из serial.read?
- Последовательный разбор странных данных
- Как отправить int массив с запросом ESP8266 http post?
- массив в последовательный порт
Что такое тип данных "Item_Name"?, @Edgar Bonet
тип данных int, @Ak Rikas
sscanf(buffer2,"%s",&Item_Name); работает, однако возвращает число вместо строки., @Ak Rikas