-
Notifications
You must be signed in to change notification settings - Fork 26
Open
Description
I am having problems printing elapsedMillis object values to the serial port in Arduino avr code, and it appears that this is caused by the object not returning an unsigned long value. The following is a small program to illustrate the problem:
/*
Name: PrintEx_ElapsedMillis.ino
Created: 8/14/2020 9:47:31 AM
Author: FRANKNEWXPS15\Frank
*/
#include <elapsedMillis.h>
#include <print.h> //allows printf-style printout syntax
elapsedMillis sinceLastCheckMsec = 0;
void setup()
{
Serial.begin(115200);
sinceLastCheckMsec = 0;
Serial.printf("small program to demonstrate problems with modified Print.h\n");
Serial.printf("Printing out value of an 'elapsedMillis' object sinceLastCheckMsec, with & without chaining\n");
Serial.printf("Printing out return value from millis(), with & without chaining\n");
Serial.println();
Serial.printf("sinceLastCheckMsec no chaining, no cast: %lu\n", sinceLastCheckMsec);
Serial.printf("sinceLastCheckMsec no chaining, cast to (unsigned long): %lu\n", (unsigned long)sinceLastCheckMsec);
Serial.printf("chaining: millis = %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\n", millis(), (unsigned long)sinceLastCheckMsec);
Serial.printf("chaining: millis: %lu\tsinceLastCheckMsec (no cast): %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\tsinceLastCheckMsec (cast to uint32_t): %lu\n",
millis(), sinceLastCheckMsec, (unsigned long)sinceLastCheckMsec, (uint32_t)sinceLastCheckMsec);
Serial.printf("chaining: millis: %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\tsinceLastCheckMsec (no cast): %lu\tsinceLastCheckMsec (cast to uint32_t): %lu\n",
millis(), (unsigned long)sinceLastCheckMsec, sinceLastCheckMsec, (uint32_t)sinceLastCheckMsec);
Serial.printf("ms: %lu\tChk: %lu\tChk:: %lu\tChk: %lu\n",
millis(), (unsigned long)sinceLastCheckMsec, sinceLastCheckMsec, (uint32_t)sinceLastCheckMsec);
Serial.printf("chaining: millis: %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\tmillis: %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\n",
millis(), (unsigned long)sinceLastCheckMsec, millis(), (unsigned long)sinceLastCheckMsec);
}
void loop()
{
}
When this is run on an Arduino Mega, I get the following output:
Opening port
Port open
small program to demonstrate problems with modified Print.h
Printing out value of an 'elapsedMillis' object sinceLastCheckMsec, with & without chaining
Printing out return value from millis(), with & without chaining
sinceLastCheckMsec no chaining, no cast: 92217847
sinceLastCheckMsec no chaining, cast to (unsigned long): 17
chaining: millis = 22 sinceLastCheckMsec (cast to unsigned long): 22
chaining: millis: 28 sinceLastCheckMsec (no cast): 1843703 sinceLastCheckMsec (cast to unsigned long): 1835008 sinceLastCheckMsec (cast to uint32_t): 0
chaining: millis: 41 sinceLastCheckMsec (cast to unsigned long): 41 sinceLastCheckMsec (no cast): 2695671 sinceLastCheckMsec (cast to uint32_t): 92209152
ms: 55 Chk: 55 Chk:: 3613175 Chk: 0
chaining: millis: 58 sinceLastCheckMsec (cast to unsigned long): 58 millis: 58 sinceLastCheckMsec (cast to unsigned long): 58
I looked at the ellapsedMillis code, but I can't for the life of me see why a reference to an elapsedMillis object doesnt return an 'unsigned long' object, but I'm pretty sure that's what is happening. I use elapsedMillis objects a lot, and it would be nice if I didn't have to remember to always explicitely cast references to 'unsigned long'.
TIA
Frank
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels