Hallo,
weil ich auch gerade an einer Formatierungsfunktion arbeite, fiel mir auf, dass der print Rückgabewert irgendwie nicht nachvollziehbar ist. Arduino print und Tommys printHex geben für eine 32Bit Variable 8 Bytes zurück. Kann aber nicht sein, wenn 32Bit nur 4 Bytes hat. Es wird immer der doppelte Wert zurückgegeben. Stimmt der Rückgabewert nicht oder habe ich einen Denkfehler?
In der print Beschreibung steht, dass die Anzahl der geschriebenen Bytes zurückgegeben wird. Was versteht man unter "geschrieben"? Selbst wenn ich noch den Nullterminator und LF dazuzähle komme ich auf 4+2 = 6 Bytes die geschrieben werden. Ich verstehe es aktuell nicht. Nutzt überhaupt jemand diesen Rückgabewert für irgendwas?
// https://forum.arduino.cc/index.php?topic=709714.0
// Printerweiterung führende 0 für Hexzahlen > 0
template <class T>
size_t formatHex(Stream &out, const T &value, const bool isLF = false)
{
size_t count = 0;
uint8_t len = sizeof(value) * 2;
uint8_t nibble;
T aktVal;
char puffer[17]; // max. longlong = 8 * 2 + '\0'
memset(puffer,0,sizeof(puffer));
// keine negativen Zahlen und max. 8 Byte groß
if (value < 0 || len > 16) {
count = out.print("Error");
if (isLF) count += out.println();
return count;
}
aktVal = value;
for(int8_t i=len-1;i>=0;i--) {
nibble = aktVal % 16;
aktVal = aktVal / 16;
puffer[i] = (nibble > 9) ? nibble-10+'A' : nibble+'0';
}
count = out.print(puffer);
if (isLF) count += out.println();
return count;
}
unsigned long a = 0xBBFFFFFF;
unsigned int b = 54321;
byte c = 128;
void setup()
{
Serial.begin(250000);
Serial.println(F("\nStart #### ####"));
size_t bytes {0};
Serial.print(a); Serial.print('\t');
bytes = formatHex(Serial, a); Serial.print(" Bytes: "); Serial.print(bytes); Serial.print('\t');
bytes = Serial.print(a, HEX); Serial.print(" Bytes: "); Serial.println(bytes);
Serial.print(b); Serial.print('\t');
bytes = formatHex(Serial, b); Serial.print(" Bytes: "); Serial.print(bytes); Serial.print('\t');
bytes = Serial.print(b, HEX); Serial.print(" Bytes: "); Serial.println(bytes);
Serial.print(c); Serial.print('\t');
bytes = formatHex(Serial, c); Serial.print(" Bytes: "); Serial.print(bytes); Serial.print('\t');
bytes = Serial.print(c, HEX); Serial.print(" Bytes: "); Serial.println(bytes);
}
void loop()
{}