Serial number from ATMega4809 processor

If anyone has a better way to read the ATMega4809 on the Nano Every board for it's serial number, Please help. I am looking to end up with the data in a char array. Here is the code I came up with using the String function but it's bloated and I'm sure there's a better way to read the register and get the processors serial number.

String serialString = String(SIGROW.SERNUM0, HEX);
serialString += String(SIGROW.SERNUM1, HEX);
serialString += String(SIGROW.SERNUM2, HEX);
serialString += String(SIGROW.SERNUM3, HEX);
serialString += String(SIGROW.SERNUM4, HEX);
serialString += String(SIGROW.SERNUM5, HEX);
serialString += String(SIGROW.SERNUM6, HEX);
serialString += String(SIGROW.SERNUM7, HEX);
serialString += String(SIGROW.SERNUM8, HEX);
serialString += String(SIGROW.SERNUM9, HEX);

serialString.toUpperCase();
int len = serialString.length();
char serialNumber[len];
serialString.toCharArray(serialNumber, len + 1);

If you want to avoid the use of String:

  char test[21];
  sprintf(test,
          "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
          SIGROW.SERNUM0,
          SIGROW.SERNUM1,
          SIGROW.SERNUM2,
          SIGROW.SERNUM3,
          SIGROW.SERNUM4,
          SIGROW.SERNUM5,
          SIGROW.SERNUM6,
          SIGROW.SERNUM7,
          SIGROW.SERNUM8,
          SIGROW.SERNUM9
         );
  Serial.println(test);

If you just need the hex value, without converting to a char array:

  byte testarray[10];

  memcpy(testarray, (void*)&SIGROW.SERNUM0, sizeof(testarray));

  for (size_t i = 0; i < sizeof(testarray); i++) {
    if (testarray[i] < 0x10)
      Serial.print('0');
    Serial.print(testarray[i], HEX);
  }
  Serial.println();

For my program I do need it in a char array. Thanks for the reply.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.