when reading RFID(MIFARE) information using Arduino mega and display in serial monitor it works fine. But, when printing on 2004LCD only one information(Value) displays correctly. The other information Item Name display a decimal number. Could someone help on this?
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("Authentication failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
status = mfrc522.MIFARE_Read(block, buffer1, &len); // ***Note down buffer1 within the bracket
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Reading failedl: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//Display price information...
for (uint8_t i = 0; i < 16; i++)
{
if (buffer1[i] != 32) // if buffer1[i] not equal to 32
{
Serial.write(buffer1[i]); //Price
//lcd.write(buffer1[i]);
Value = buffer1[i];
}
}
Serial.print("/=");
Serial.println(" ");
sscanf(buffer1,"%d",&Value);
lcd.setCursor(0,1);
lcd.println(Value);
}
//==========================================================
void Item(){ //----- Get & Display Item information
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]); // Display Item
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);// displays numbers instead of "Fresh Milk 1Lt
}
1 Answer 1
Consider the following:
char buffer2[16]; // array of 16 chars
for (uint8_t i = 0; i < 16; i++) {
do_something_with(buffer2[i]); // handle one char at a time
}
Here we have an array of 16 cells, each having the char
type (which I
assume is what you have). The loop goes through the array, handling one
cell a time. Within the loop, buffer2[i]
represents the char
being
currently handled.
Keep in mind that a char
is just an 8-bit integer. It is somehow
implied that it is meant to represent a character, where 32 = ' '
(space), 33 = '!'
, 48 = '0'
, 65 = 'A'
and so on (see ASCII).
The Arduino print()
methods do assume a char
(unlike an int
) is
intended to be displayed as a character.
Now your actual loop:
int Item_Name;
for (uint8_t i = 0; i < 16; i++) {
Serial.write(buffer2[i]); // write the char on the serial port
lcd.write(buffer2[i]); // write the char on the LCD
Item_Name=buffer2[i]; // store the char in a variable
}
This will print the contents of the buffer to both the serial port and
the LCD. You would have seen the expected message on the LCD if you did
not have lcd.clear()
right after the loop.
sscanf(buffer2, "%s", &Item_Name);
This means "extract from buffer2
a sequence of contiguous
non-white-space characters, and store it in memory at the address of the
variable ItemName
". If the buffer contains "Fresh Milk 1Lt", this will
write "Fresh" to that memory location. That is 6 bytes (5 letters and a
terminating NUL). Unfortunately, the compiler has only allocated 2 or
4 bytes of RAM for storing ItemName
(depending on the Arduino model),
so this will write past the allocated storage, which is a type of bug
known as buffer overflow. Now your Arduino's memory is corrupted and
anything can happen.
sprintf(buffer2, "%d", &Item_Name);
This tries to find within byffer2
a textual representation of a
number, and store it into Item_Name
. This is safe, but only makes
sense if the buffer contains a number, written as text, which is not the
case here.
lcd.print(Item_Name);
This is asking the LCD to print an integer (namely Item_Name
). It will
convert the integer to decimal text and print the corresponding digits
on the LCD.
Let's assume for example that Item_Name
contains the numeric value
32
(which is the ASCII representation of a space). lcd.print()
will
convert that into a sequence of two characters: '3'
and '2'
(the
decimal representation of 32). It will then send those characters to the
LCD (ASCII values 51 and 50), and you will see the text "32".
If you want to see the text contained within the buffer, the you can
either send the characters one by one (like you already did right before
lcd.clear()
), or provide to lcd.print()
a char*
pointer with the
whole message:
lcd.print(buffer2);
This assumes that the buffer is terminated with a NUL character. If it is not, then you can either use the char-at-a-time method, or change your code in order to put a NUL terminator in the buffer.
-
Thank you so much! it's working when i change the data type of buffer2 from byte array to character arrayAk Rikas– Ak Rikas2021年03月21日 16:55:20 +00:00Commented Mar 21, 2021 at 16:55
Item_Name
?