ЖК-дисплей с байтовым массивом

при считывании 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
     }

lcd Serial op

, 👍1

Обсуждение

Что такое тип данных "Item_Name"?, @Edgar Bonet

тип данных int, @Ak Rikas

sscanf(buffer2,"%s",&Item_Name); работает, однако возвращает число вместо строки., @Ak Rikas


1 ответ


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

0

Рассмотрим следующее:

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